[最短路]2197 分糖果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[最短路]2197 分糖果相关的知识,希望对你有一定的参考价值。

题目描述 Description

童年的我们,将和朋友分享美好的事物作为自己的快乐。这天,C小朋友得到了Plenty of candies,将要把这些糖果分给要好的朋友们。已知糖果从一个人传给另一个人需要1 秒的时间,同一个小朋友不会重复接受糖果。由于糖果足够多,如果某时刻某小朋友接受了糖果,他会将糖果分成若干份,分给那些在他身旁且还没有得到糖果的小朋友们,而且自己会吃一些糖果。由于嘴馋,小朋友们等不及将糖果发完,会在得到糖果后边吃边发。每个小朋友从接受糖果到吃完糖果需要m秒的时间。那么,如果第一秒C小朋友开始发糖,第多少秒所有小朋友都吃完了糖呢?

输入描述 Input Description

第一行为三个数n、p、c,为小朋友数、关系数和C小朋友的编号。
第二行为一个数m,表示小朋友吃糖的时间。
下面p行每行两个整数,表示某两个小朋友在彼此身旁

输出描述 Output Description

一个数,为所有小朋友都吃完了糖的时间

样例输入 Sample Input

4 3 1
2
1 2
2 3
1 4

样例输出 Sample Output

5

数据范围及提示 Data Size & Hint

【限制】
40%的数据满足:1<=n<=100
60%的数据满足:1<=n<=1000
100%的数据满足:1<=n<=100000
m<=n*(n-1)/2,不会有同一个关系被描述多次的情况。

【样例解释】
  第一秒,糖在1手上。第二秒,糖传到了2、3的手中。第三秒,糖传到了4的手中,此时1吃完了。第四秒,2、3吃完了。第五秒,4吃完了。所以答案是5。

------------------------------------------------------

Oops! 你的分析出现了一些问题,需要在这儿省略.

           已完成  1%                                       : (

请查阅代码:  0x23333333

------------------------------------------------------

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=100001;
 4 int n,m,p,c,dis[N];
 5 int head[N],nxt[N],to[N],cnt,val[N];
 6 bool vis[N];
 7 void add(int x,int y,int z)
 8 {
 9     cnt++;
10     nxt[cnt]=head[x];
11     head[x]=cnt;
12     to[cnt]=y;
13     val[cnt]=z;
14 }
15 void spfa()
16 {
17     queue<int>q;
18     q.push(c);
19     while(!q.empty())
20     {
21         int u=q.front();
22         q.pop();
23         vis[u]=false;
24         for(int i=head[u]; i; i=nxt[i])
25         {
26             if(dis[to[i]]>dis[u]+val[i])
27             {
28                 dis[to[i]]=dis[u]+val[i];
29                 if(!vis[to[i]])
30                 {
31                     vis[to[i]]=true;
32                     q.push(to[i]);
33                 }
34             }
35         }
36     }
37 }
38 int main()
39 {
40     /*
41         分糖果
42     */
43     cin>>n>>p>>c>>m;
44     for(int i=1; i<=p; i++)
45     {
46         int x,y;
47         cin>>x>>y;
48         add(x,y,1);
49         add(y,x,1);
50     }
51     memset(dis,0x3f,sizeof dis);
52     dis[c]=0;
53     spfa();
54     printf("%d",*max_element(dis+1,dis+n+1)+1+m);
55     return 0;
56 }

 

以上是关于[最短路]2197 分糖果的主要内容,如果未能解决你的问题,请参考以下文章

AcWing 4247. 糖果(差分约束最短路)

[BZOJ2330][SCOI2011]糖果 差分约束系统+最短路

LeetCode 5219. 每个小孩最多能分到多少糖果

情侣牵手,分发糖果,跳跃游戏,单源最短路径Dijkstra算法,贪心算法构造霍夫曼编码

P3275 [SCOI2011]糖果 && 差分约束

bzoj2330: [SCOI2011]糖果