tyvjP1083 分糖果

P1083 - 分糖果

From Admin    Normal (OI) 总时限:6s    内存限制:128MB

描述 Description

童年的我们,将和朋友分享美好的事物作为自己的快乐。这天,C小朋友得到了Plenty of candies,将要把这些糖果分给要好的朋友们。已知糖果从一个人传给另一个人需要1 秒的时间,同一个小朋友不会重复接受糖果。由于糖果足够多,如果某时刻某小朋友接受了糖果,他会将糖果分成若干份,分给那些在他身旁且还没有得到糖果的小朋友们,而且自己会吃一些糖果。由于嘴馋,小朋友们等不及将糖果发完,会在得到糖果后边吃边发。每个小朋友从接受糖果到吃完糖果需要m秒的时间。那么,如果第一秒C小朋友开始发糖,第多少秒所有小朋友都吃完了糖呢?

输入格式 InputFormat

第一行为三个数n、p、c,为小朋友数、关系数和C小朋友的编号。 第二行为一个数m,表示小朋友吃糖的时间。 下面p行每行两个整数,表示某两个小朋友在彼此身旁

输出格式 OutputFormat

一个数,为所有小朋友都吃完了糖的时间

样例输入 SampleInput [复制数据]

4 3 1
2
1 2
2 3
1 4

样例输出 SampleOutput [复制数据]

5

数据范围和注释 Hint

【限制】 40%的数据满足:1<=n<=100 60%的数据满足:1<=n<=1000 100%的数据满足:1<=n<=100000 m<=n*(n-1)/2,不会有同一个关系被描述多次的情况。【样例解释】 第一秒,糖在1手上。第二秒,糖传到了2、3的手中。第三秒,糖传到了4的手中,此时1吃完了。第四秒,2、3吃完了。第五秒,4吃完了。所以答案是5。

时间限制 TimeLimitation

各个测试点1s
program tyvj1083; var map:array[1..100000,0..200] of longint; q,time:array[1..100000] of longint; mark:array[1..100000] of boolean; i,m,head,tail,n,p,first,x,y,k,ans:longint; procedure push(x:longint); begin inc(head); q[head]:=x; mark[x]:=true; end; function pop:longint; begin pop:=q[tail]; inc(tail); end; begin fillchar(mark,sizeof(mark),false); fillchar(map,sizeof(map),0); readln(n,p,first); readln(m); for i:=1 to p do begin readln(x,y); inc(map[x,0]); map[x,map[x,0]]:=y; inc(map[y,0]); map[y,map[y,0]]:=x; end; head:=0;tail:=1;ans:=0; time[first]:=1; push(first); while head>=tail do begin k:=pop; if time[k]+m>ans then ans:=time[k]+m; for i:=1 to map[k,0] do if not(mark[map[k,i]]) then  begin time[map[k,i]]:=time[k]+1; push(map[k,i]); end; end; writeln(ans); end.

posted on 2012-10-17 21:12  馒头~blue  阅读(858)  评论(0)    收藏  举报

导航