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 }

 

 
posted @ 2022-12-29 18:05  CRt0729  阅读(59)  评论(0编辑  收藏  举报