「JoyOI1083」分糖果
题目描述
童年的我们,将和朋友分享美好的事物作为自己的快乐。这天,C小朋友得到了Plenty of candies,将要把这些糖果分给要好的朋友们。已知糖果从一个人传给另一个人需要1 秒的时间,同一个小朋友不会重复接受糖果。由于糖果足够多,如果某时刻某小朋友接受了糖果,他会将糖果分成若干份,分给那些在他身旁且还没有得到糖果的小朋友们,而且自己会吃一些糖果。由于嘴馋,小朋友们等不及将糖果发完,会在得到糖果后边吃边发。每个小朋友从接受糖果到吃完糖果需要m秒的时间。那么,如果第一秒C小朋友开始发糖,第多少秒所有小朋友都吃完了糖呢?
输入
第一行为三个数n、p、c,为小朋友数、关系数和C小朋友的编号。 第二行为一个数m,表示小朋友吃糖的时间。 下面p行每行两个整数,表示某两个小朋友在彼此身旁
输出
一个数,为所有小朋友都吃完了糖的时间
样例输入
4 3 1 2 1 2 2 3 1 4
样例输出
5
提示
「限制」 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。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#include<iostream> #include<cstdio> using namespace std; int n,p,c,m,cnt; struct data{ int to,next,v; }e[1000001]; int head[100001]; void insert(int u,int v) { cnt++; e[cnt].to=v; e[cnt].v=1; e[cnt].next=head[u]; head[u]=cnt; } void bfs(int x) { int t=0,w=1,i,now; int q[100001],step[100001]; q[0]=x;step[x]=1; while(t<w) { now=q[t];t++; i=head[now]; while(i) { if(!step[e[i].to]) { q[w++]=e[i].to; step[e[i].to]=step[now]+1; } i=e[i].next; } } printf("%d",step[q[w-1]]+m); } int main() { scanf("%d%d%d",&n,&p,&c); scanf("%d",&m); for(int i=1;i<=p;i++) { int x,y; scanf("%d%d",&x,&y); insert(x,y);insert(y,x); } bfs(c); return 0; } |
Subscribe