分糖果
描述 Description | |||
童年的我们,将和朋友分享美好的事物作为自己的快乐。这天,C小朋友得到了Plenty of candies,将要把这些糖果分给要好的朋友们。已知糖果从一个人传给另一个人需要1 秒的时间,同一个小朋友不会重复接受糖果。由于糖果足够多,如果某时刻某小朋友接受了糖果,他会将糖果分成若干份,分给那些在他身旁且还没有得到糖果的小朋友们,而且自己会吃一些糖果。由于嘴馋,小朋友们等不及将糖果发完,会在得到糖果后边吃边发。每个小朋友从接受糖果到吃完糖果需要m秒的时间。那么,如果第一秒C小朋友开始发糖,第多少秒所有小朋友都吃完了糖呢? | |||
输入格式 Input Format | |||
第一行为三个数n、p、c,为小朋友数、关系数和C小朋友的编号。 第二行为一个数m,表示小朋友吃糖的时间。 下面p行每行两个整数,表示某两个小朋友在彼此身旁 | |||
输出格式 Output Format | |||
一个数,为所有小朋友都吃完了糖的时间 | |||
样例输入 Sample Input [复制数据] | |||
样例输出 Sample Output [复制数据] | |||
时间限制 Time Limitation | |||
各个测试点1s | |||
注释 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。 |
===============================
搜索水题
========================
type
point=^node;
node=record
x:longint;
next:point;
end;
re=record
x:longint;
ans:longint;
end;
var
n,p,c,m:longint;
peo:array[1..100000]of point;
f:array[1..100000]of boolean;
h:array[1..100000]of re;
procedure init;
begin
assign(input,'ty1083.in');
assign(output,'ty1083.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure insert(x,y:longint);
var
p:point;
begin
new(p);
p^.x:=y; p^.next:=peo[x];
peo[x]:=p;
end;
procedure bfs;
var
l,r:longint;
x:longint;
p:point;
begin
l:=0; r:=1;
h[r].x:=c;
h[r].ans:=1;
repeat
inc(l);
x:=h[l].x;
p:=peo[x];
while p<>nil do
begin
x:=p^.x;
if f[x] then
begin
f[x]:=false;
inc(r);
h[r].x:=x;
h[r].ans:=h[l].ans+1;
end;
p:=p^.next;
end;
until l>=r;
writeln(h[r].ans+m);
end;
procedure main;
var
i:longint;
x,y:longint;
begin
readln(n,p,c);
readln(m);
for i:=1 to n do peo[i]:=nil;
for i:=1 to p do
begin
readln(x,y);
insert(x,y);
insert(y,x);
end;
fillchar(f,sizeof(f),true);
bfs;
end;
begin
init;
main;
terminate;
end.