分糖果

来源:互联网 发布: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