分糖果

  分糖果
  描述 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.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值