天梯赛 深入虎穴

    xiaoxiao2025-07-27  15

    著名的王牌间谍 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

    分析 题目的意思应该是要找深度最深的一个门,于是存储一下门的深度,再进行迭代更新。

    #include<iostream> using namespace std; #define N 100000 + 10 struct Node { int parent; int depth; } m[N]; int main() { int n; cin >> n; int j,k; for(int i = 1; i <= n; i++) { cin >> k; while(k--) { cin >> j; m[j].depth = m[i].depth + 1; m[j].parent = i; } } //迭代更新 for(int i = 0; i < 4; i++) for(int j = 1; j <= n; j++) m[j].depth = m[m[j].parent].depth + 1; int maxn = -1,index; for(int i = 1; i <= n; i++) if(maxn < m[i].depth) { maxn = m[i].depth; index = i; } cout << index << endl; return 0; }
    最新回复(0)