PTA 深入虎穴 (25分)

  • Post author:
  • Post category:其他




PTA 深入虎穴 (25分)

著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报。已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门。每一扇门背后或者是一个房间,或者又有很多条路,同样是每条路通向一扇门…… 他的手里有一张表格,是其他间谍帮他收集到的情报,他们记下了每扇门的编号,以及这扇门背后的每一条通路所到达的门的编号。007 发现不存在两条路通向同一扇门。

内线告诉他,情报就藏在迷宫的最深处。但是这个迷宫太大了,他需要你的帮助 —— 请编程帮他找出距离入口最远的那扇门。


输入格式:

输入首先在一行中给出正整数 N(<10​5​​),是门的数量。最后 N 行,第 i 行(1≤i≤N)按以下格式描述编号为 i 的那扇门背后能通向的门:

K D[1] D[2] ... D[K]

其中 K 是通道的数量,其后是每扇门的编号。


输出格式:

在一行中输出距离入口最远的那扇门的编号。题目保证这样的结果是唯一的。


输入样例:

13
3 2 3 4
2 5 6
1 7
1 8
1 9
0
2 11 10
1 13
0
0
1 12
0
0


输出样例:

12

该题关键在于找到入口,然后再从入口处DFS

#include<iostream>
#include<string>
#include<math.h>
#include<map>
#include<iterator>
#include<iomanip>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
#include<stack>
#include<cmath>
#define eps 1e-8
#define MOD 1000000007
typedef long long ll;
using namespace std;
int in[100005];		   //记录每个点的入度
int vis[100005];	   //记录点是否访问过
vector<int> numpos[100005];//记录每个点的后继点
int maxnum = 1;            //最远距离
int ans = 1;		   //答案
void dfs(int n,int deep) {
 if (vis[n]) {
  if (maxnum < deep) {  //更新最远距离和答案
   maxnum = deep;
   ans = n;
  }
  return;
 }
 else {
  vis[n] = 1;
  for (int i = 1; i <= numpos[n].front(); i++) {
   dfs(numpos[n][i], deep + 1);
  }
 }
}
int main(void) {
 int num;
 int i = 1;
 cin >> num;
 int num2 = num;
 memset(in, 0, sizeof(in));
 memset(vis, 0, sizeof(vis));
  while (num--) {
   int out; //点的出度
   cin >> out;
   if (out == 0)  //出度为0,即为出口
    vis[i] = 1;
   else {
    int x;
    numpos[i].push_back(out);  //记录该点后继点数量
    for (int j = 1; j <= out; j++) {
     cin >> x;
     (in[x]) += 1;     //入度+1
     numpos[i].push_back(x);
    }
   }
   i++;
  }
  for (int k = 1; k <= num2; k++) {
   if (in[k] == 0) {   //入度为0,即为入口
    dfs(k, 1);
   }
  }
 cout << ans << endl;
}



版权声明:本文为zlj187原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。