TZOJ 5777: 分糖果 bfs/队列
描述
童年的我们,将和朋友分享美好的事物作为自己的快乐。这天,C小朋友得到了Plenty of candies,将要把这些糖果分给要好的朋友们。已知糖果从一个人传给另一个人需要1 秒的时间,同一个小朋友不会重复接受糖果。由于糖果足够多,如果某时刻某小朋友接受了糖果,他会将糖果分成若干份,分给那些在他身旁且还没有得到糖果的小朋友们,而且自己会吃一些糖果。由于嘴馋,小朋友们等不及将糖果发完,会在得到糖果后边吃边发。每个小朋友从接受糖果到吃完糖果需要m秒的时间。那么,如果第一秒C小朋友开始发糖,第多少秒所有小朋友都吃完了糖呢?
输入
第一行为三个数n、p、c,为小朋友数、关系数和C小朋友的编号。
第二行为一个数m,表示小朋友吃糖的时间。
下面p行每行两个整数,表示某两个小朋友在彼此身旁。
输出
一个数,为所有小朋友都吃完了糖的时间。
样例输入
4 3 1
2
1 2
2 3
1 4
样例输出
5
————————————————————————
因为数据范围有10w,所以不能直接开数组,得用动态数组vector,然后输入数据庞大,所以要用scanf输入
题目的本质就是求起点c开始,走多少步能走完所有的点,走完后再+上m即可,因为走完所有的点后最后一个点的人还是花费m时间吃完糖果
如果是没有学到本知识点请勿抄袭!
1 #include<bits/stdc++.h> 2 using namespace std; 3 int vis[100005],f[100005]; 4 vector<int>a[100005]; 5 queue<int>q; 6 int n,p,c,m; 7 void bfs() 8 { 9 q.push(c); 10 f[c] = 1; 11 vis[c] = 1; 12 while(!q.empty()) 13 { 14 int t = q.front(); 15 q.pop(); 16 for(int i=0;i<a[t].size();i++) 17 { 18 if(vis[a[t][i]]==0) 19 { 20 vis[a[t][i]] = 1; 21 f[a[t][i]] = f[t]+1; 22 q.push(a[t][i]); 23 } 24 } 25 } 26 } 27 int main() 28 { 29 cin>>n>>p>>c>>m; 30 for(int i = 1;i<=p;i++) 31 { 32 int x,y; 33 scanf("%d %d",&x,&y); 34 a[x].push_back(y); 35 a[y].push_back(x); 36 } 37 bfs(); 38 int ans = 0; 39 for(int i=1;i<=n;i++) 40 if(f[i]>ans) 41 ans = f[i]; 42 cout<<ans+m; 43 return 0; 44 }