分糖果(信息学奥赛一本通-T1380)
生活随笔
收集整理的這篇文章主要介紹了
分糖果(信息学奥赛一本通-T1380)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
童年的我們,將和朋友分享美好的事物作為自己的快樂。這天,C小朋友得到了Plenty of candies,將要把這些糖果分給要好的朋友們。已知糖果從一個人傳給另一個人需要1 秒的時間,同一個小朋友不會重復接受糖果。由于糖果足夠多,如果某時刻某小朋友接受了糖果,他會將糖果分成若干份,分給那些在他身旁且還沒有得到糖果的小朋友們,而且自己會吃一些糖果。由于嘴饞,小朋友們等不及將糖果發完,會在得到糖果后邊吃邊發。每個小朋友從接受糖果到吃完糖果需要m秒的時間。那么,如果第一秒C小朋友開始發糖,第多少秒所有小朋友都吃完了糖呢?
【輸入】
第一行為三個數n、p、c,為小朋友數、關系數和C小朋友的編號。
第二行為一個數m,表示小朋友吃糖的時間。
下面p行每行兩個整數,表示某兩個小朋友在彼此身旁。
【輸出】
一個數,為所有小朋友都吃完了糖的時間。
【輸入樣例】
?4 3 1
2
1 2
2 3
1 4
【輸出樣例】
5
【源程序】
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<set> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 10010 #define MOD 123 #define E 1e-6 using namespace std; struct node{int pre;int next;int w; }a[N*20]; int cnt; int head[N],q[N*10]; int vis[N],f[N]; void add(int x,int y,int w) {cnt++;a[cnt].pre=y;a[cnt].next=head[x];a[cnt].w=w;head[x]=cnt;cnt++;a[cnt].pre=x;a[cnt].next=head[y];a[cnt].w=w;head[y]=cnt; }int main() {int n,m,c,p;cin>>n>>p>>c>>m;for(int i=1;i<=p;i++){int x,y;cin>>x>>y;add(x,y,1);}memset(f,INF,sizeof(f));f[c]=0;vis[c]=1;int headd=1,tail=1;q[tail]=c;tail++;while(headd<tail){int x=q[headd];int k=head[x];while(k!=0){int y=a[k].pre;if(f[y]>f[x]+a[k].w){f[y]=f[x]+a[k].w;if(vis[y]==0){q[tail]=y;vis[y]=1;tail++;}}k=a[k].next;}headd++;}int maxx=-INF;for(int i=1;i<=n;i++)maxx=max(maxx,f[i]);cout<<maxx+m+1<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的分糖果(信息学奥赛一本通-T1380)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求最大公约数问题(信息学奥赛一本通-T1
- 下一篇: 2018 年“浪潮杯”山东省 ACM 省