分糖果
来源:互联网 发布:qq阅读诺基亚java 编辑:程序博客网 时间:2024/04/28 13:01
Problem Description童年的我们将和朋友分享美好的事物作为自己的快乐。这天,C小朋友得到了糖果,将要把这些糖果分给要好的朋友们。已知糖果从一个人传给另一个人需要1秒的时间,同一个小朋友不会重复接受糖果。由于糖果足够多,如果某时刻某小朋友接受了糖果,他会将糖果分成若干份,分给那些在他身旁且还没有得到糖果的小朋友们,而且自己会吃一些糖果。由于嘴馋,小朋友们等不及将糖果发完,会在得到糖果后边吃边发。每个小朋友从接受糖果到吃完糖果需要m秒的时间。那么,如果第一秒C小朋友开始发糖,第几秒所有小朋友都吃完了糖呢?Input输入有多组数据,每组数据第1行为三个数n(<=10000),p(<=600000),c为小朋友数,关系数和C小朋友的编号。第2行为一个数m(<=8000),表示小朋友吃糖的时间。下面p行每行两个整数,表示某两个小朋友在彼此身旁。Output对于每组输入输出一个单独的整数表示从Ts到Te的最小总费用。数据保证至少存在一条道路。Sample Input4 3 121 22 31 4Sample Output5//关键字:广搜。//标程:#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<vector>using namespace std;vector<int> vec[10001];int a[10001],vis[10001];queue<int> q;void bfs(){ while(!q.empty()) { int temp = q.front(); q.pop(); for(int i = 0; i < vec[temp].size(); ++ i) { if(!vis[vec[temp][i]]) { vis[vec[temp][i]] = 1; a[vec[temp][i]] = a[temp] + 1; q.push(vec[temp][i]); } } }}int main(){// freopen("a.txt","r",stdin); int n, c, p, m, i; while(scanf("%d%d%d",&n,&p,&c)!=EOF) { scanf("%d",&m); memset(vis,0,sizeof(vis)); memset(a,0,sizeof(a)); int s, e; for(i = 0; i < p; ++ i) { scanf("%d%d",&s,&e); vec[s].push_back(e); vec[e].push_back(s); } while(!q.empty()) q.pop(); q.push(c); vis[c] = 1; a[c] = 1; bfs(); int Max = 0; for(i = 1; i <= n; ++ i) if(a[i] > Max) Max = a[i]; cout << Max + m << endl; } return 0;}
0 0