Problem Description
童年的我们将和朋友分享美好的事物作为自己的快乐。这天,C小朋友得到了糖果,将要把这些糖果分给要好的朋友们。已知糖果从一个人传给另一个人需要1秒的时间,同一个小朋友不会重复接受糖果。由于糖果足够多,如果某时刻某小朋友接受了糖果,他会将糖果分成若干份,分给那些在他身旁且还没有得到糖果的小朋友们,而且自己会吃一些糖果。由于嘴馋,小朋友们等不及将糖果发完,会在得到糖果后边吃边发。每个小朋友从接受糖果到吃完糖果需要m秒的时间。那么,如果第一秒C小朋友开始发糖,第几秒所有小朋友都吃完了糖呢?
Input
输入有多组数据,每组数据第1行为三个数n(<=10000),p(<=600000),c为小朋友数,关系数和C小朋友的编号。
第2行为一个数m(<=8000),表示小朋友吃糖的时间。
下面p行每行两个整数,表示某两个小朋友在彼此身旁。
Output
对于每组输入输出一个单独的整数表示从Ts到Te的最小总费用。数据保证至少存在一条道路。
Sample Input
4 3 1
2
1 2
2 3
1 4
Sample Output
5
//关键字:广搜。
//标程:
#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;
}
分糖果
最新推荐文章于 2022-10-01 11:52:43 发布