标签:its int pop mil using 输入 while 输出 个人
童年的我们,将和朋友分享美好的事物作为自己的快乐。这天,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。
Oops! 你的分析出现了一些问题,需要在这儿省略.
已完成 1% : (
请查阅代码: 0x23333333
------------------------------------------------------
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=100001; 4 int n,m,p,c,dis[N]; 5 int head[N],nxt[N],to[N],cnt,val[N]; 6 bool vis[N]; 7 void add(int x,int y,int z) 8 { 9 cnt++; 10 nxt[cnt]=head[x]; 11 head[x]=cnt; 12 to[cnt]=y; 13 val[cnt]=z; 14 } 15 void spfa() 16 { 17 queue<int>q; 18 q.push(c); 19 while(!q.empty()) 20 { 21 int u=q.front(); 22 q.pop(); 23 vis[u]=false; 24 for(int i=head[u]; i; i=nxt[i]) 25 { 26 if(dis[to[i]]>dis[u]+val[i]) 27 { 28 dis[to[i]]=dis[u]+val[i]; 29 if(!vis[to[i]]) 30 { 31 vis[to[i]]=true; 32 q.push(to[i]); 33 } 34 } 35 } 36 } 37 } 38 int main() 39 { 40 /* 41 分糖果 42 */ 43 cin>>n>>p>>c>>m; 44 for(int i=1; i<=p; i++) 45 { 46 int x,y; 47 cin>>x>>y; 48 add(x,y,1); 49 add(y,x,1); 50 } 51 memset(dis,0x3f,sizeof dis); 52 dis[c]=0; 53 spfa(); 54 printf("%d",*max_element(dis+1,dis+n+1)+1+m); 55 return 0; 56 }
标签:its int pop mil using 输入 while 输出 个人
原文地址:http://www.cnblogs.com/InfoEoR/p/7364983.html