[PTA]L2-031 深入虎穴 (25 分)
L2-031 深入虎穴 (25 分)
Description
著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报。已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门。每一扇门背后或者是一个房间,或者又有很多条路,同样是每条路通向一扇门…… 他的手里有一张表格,是其他间谍帮他收集到的情报,他们记下了每扇门的编号,以及这扇门背后的每一条通路所到达的门的编号。007 发现不存在两条路通向同一扇门。
内线告诉他,情报就藏在迷宫的最深处。但是这个迷宫太大了,他需要你的帮助 —— 请编程帮他找出距离入口最远的那扇门。
Input
输入首先在一行中给出正整数 N(<),是门的数量。最后 N 行,第 i 行(1)按以下格式描述编号为 i 的那扇门背后能通向的门:
K D[1] D[2] ... D[K]
其中 K
是通道的数量,其后是每扇门的编号。
output
在一行中输出距离入口最远的那扇门的编号。题目保证这样的结果是唯一的。
Examples
Input
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
Output
12
注意:
不知道入口是哪一个!
正确解法:
找入口
按照bfs用邻接表遍历一边,然后找最远的那一个点。
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<map> 6 #include<set> 7 #include<vector> 8 #include<queue> 9 #include<algorithm> 10 #include<cmath> 11 using namespace std; 12 typedef long long ll; 13 const int inf=0x7fffffff; 14 const int N=100000+100; 15 const int M=9999999; 16 const ll mod=1000000000+7; 17 int bok[N],n,k,que[N],x,cnt[N]; 18 int Link[N],len=0; 19 struct node 20 { 21 int y,v,next; 22 }e[N]; 23 void insert(int xx,int yy,int vv) 24 { 25 e[++len].next=Link[xx]; 26 Link[xx]=len; 27 e[len].y=yy; 28 e[len].v=vv; 29 } 30 void init() 31 { 32 scanf("%d",&n); 33 for(int i=1;i<=n;i++) 34 { 35 scanf("%d",&k); 36 while(k--) 37 { 38 scanf("%d",&x); 39 bok[x]=1; 40 insert(i,x,1); 41 } 42 } 43 } 44 void bfs(int x) 45 { 46 memset(bok,0,sizeof(bok)); 47 int head=1,tail=2; 48 que[1]=x; 49 bok[x]=1; 50 cnt[x]=0; 51 while(head<tail) 52 { 53 for(int i=Link[que[head]];i;i=e[i].next) 54 { 55 if(bok[e[i].y]==0) 56 { 57 bok[e[i].y]=1; 58 que[tail++]=e[i].y; 59 cnt[e[i].y]=cnt[que[head]]+1; 60 } 61 } 62 head++; 63 } 64 cout<<que[tail-1]<<endl; 65 } 66 int main() 67 { 68 init(); 69 for(int i=1;i<=n;i++) 70 if(bok[i]==0) 71 { 72 //cout<<i<<endl; 73 bfs(i); 74 break; 75 } 76 77 return 0; 78 }
No matter how you feel, get up , dress up , show up ,and never give up.