L2-031 深入虎穴 (25 分)
著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报。已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门。每一扇门背后或者是一个房间,或者又有很多条路,同样是每条路通向一扇门…… 他的手里有一张表格,是其他间谍帮他收集到的情报,他们记下了每扇门的编号,以及这扇门背后的每一条通路所到达的门的编号。007 发现不存在两条路通向同一扇门。
内线告诉他,情报就藏在迷宫的最深处。但是这个迷宫太大了,他需要你的帮助 —— 请编程帮他找出距离入口最远的那扇门。
/*
这是一个森林 (用vector存储所有孩子节点)
注意入口是要自己寻找的,不是固定的
注意特殊情况的发生(只有一个门)
用深搜遍历所有节点
*/
#include<bits/stdc++.h>
using namespace std;
vector<int> v[100010];//存储森林
int Max_road=0;//最深的路长度
int Max_num;//最深的节点
bool flag[100010]={false};//标记其他的门,找到入口
void DFS(int a,int num)
{
if(num>Max_road)
{
Max_road=num;
Max_num=a;
}
int length=v[a].size() ;
for(int i=0;i<length;i++)
{
DFS(v[a][i],num+1);
}
}
int main(void)
{
int n,k;
cin>>n;//门总数
for(int i=1;i<=n;i++)
{
int m;
cin>>m;//门后的路
for(int j=0;j<m;j++)
{
int a;
cin>>a;
if(!flag[a])//标记门,找入口
{
flag[a]=true;
v[i].push_back(a);
}
}
}
for(int i=1;i<=n;i++)//找入口 k
{
if(!flag[i])
{
k=i;
break;
}
}
Max_num=k; //如果只有一扇门 测试点 1
DFS(k,0);
cout<<Max_num<<endl;
return 0;
}