1380:分糖果(candy)
【題目描述】
童年的我們,將和朋友分享美好的事物作為自己的快樂。這天,C小朋友得到了Plenty of candies,將要把這些糖果分給要好的朋友們。已知糖果從一個人傳給另一個人需要1 秒的時間,同一個小朋友不會重複接受糖果。由於糖果足夠多,如果某時刻某小朋友接受了糖果,他會將糖果分成若干份,分給那些在他身旁且還沒有得到糖果的小朋友們,而且自己會吃一些糖果。由於嘴饞,小朋友們等不及將糖果發完,會在得到糖果後邊吃邊發。每個小朋友從接受糖果到吃完糖果需要m秒的時間。那麼,如果第一秒C小朋友開始發糖,第多少秒所有小朋友都吃完了糖呢?
【輸入】
第一行為三個數n、p、c,為小朋友數、關係數和C小朋友的編號。
第二行為一個數m,表示小朋友吃糖的時間。
下面p行每行兩個整數,表示某兩個小朋友在彼此身旁。
【輸出】
一個數,為所有小朋友都吃完了糖的時間。
【輸入樣例】
4 3 1 2 1 2 2 3 1 4
【輸出樣例】
5
【提示】
【樣例解釋】
第一秒,糖在1手上。第二秒,糖傳到了2、3的手中。第三秒,糖傳到了4的手中,此時1吃完了。第四秒,2、3吃完了。第五秒,4吃完了。所以答案是5。
【限制】
40%的資料滿足:1≤n≤100
60%的資料滿足:1≤n≤1000
100%的資料滿足:1≤n≤100000
m≤n*(n-1)/2,不會有同一個關係被描述多次的情況。
這題用最短路徑是可以做的,其實這題是求樹的深度,那麼用bfs也是可以,bfs過了,但是dfs沒有過,不知道為啥,
解釋一下用最短路的思路 4-1-2-3這個圖是這樣的從1開始出發每個權值是1 然後最後求的1到另外的點的最大值是2然後加上到1的時間,還有最後一個吃完的時間就少5
#include<bits/stdc++.h> using namespace std; const int inf=0x3f3f3f3f; const int N=100100; int dis[N*10]; struct node { int from; int to; int next; int dis; }s[N*20]; int head[N*10]={0}; int vis[N]={0}; int cnt=0; void add_edge(int from,int to,int dis) { s[++cnt].next=head[from]; s[cnt].to=to; s[cnt].dis=dis; head[from]=cnt; } int n,p,c; int m; void spfa(int ss) { memset(dis,inf,sizeof(dis)); vis[ss]=1; dis[ss]=0; queue<int>Q; Q.push(ss); while(!Q.empty()){ int u=Q.front(); Q.pop(); vis[u]=0; for(int i=head[u];i!=0;i=s[i].next){ int to=s[i].to; int di=s[i].dis; if(dis[to]>dis[u]+di){ dis[to]=dis[u]+di; if(!vis[to]){ vis[to]=1; Q.push(to); } } } } } int main() { ios::sync_with_stdio(false); cin>>n>>p>>c>>m; memset(head,0,sizeof(head)); for(int i=0;i<p;i++){ int x,y; cin>>x>>y; add_edge(x,y,1); add_edge(y,x,1); } spfa(c); int maxn=-1; for(int i=1;i<=n;i++){ if(maxn<dis[i]) maxn=dis[i]; } cout<<maxn+1+m<<endl; return 0; }
用bfs是就是搜尋樹的深度,是多高,bfs AC了,不知道為啥DFS沒有AC是0分感覺這個網站有時候測試資料真的有問題
在用bfs的時候求ans的時候在for裡面是是要+1求最大值,在外面是不需要的,因為這是因為最後一個是進不去for的所以在外邊就不用加
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n,p,c,m;
vector<int>g[100005];
int vis[100005];
struct node
{
int to;
int step;
node(){}
node(int to1,int step1):to(to1),step(step1){}
};
int ans;
void bfs(int to)
{
vis[to]=1;
queue<node>Q;
Q.push(node(to,1));
while(!Q.empty()){
node u=Q.front();
Q.pop();
//ans=u.step;
for(int i=0;i<g[u.to].size();i++){
int x=g[u.to][i];
if(!vis[x]){
vis[x]=1;
ans=max(ans,u.step+1);
Q.push(node(x,u.step+1));
}
}
}
}
int main()
{
scanf("%d %d %d",&n,&p,&c);
scanf("%d",&m);
for(int i=0;i<p;i++){
int x,y;
scanf("%d %d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
bfs(c);
printf("%d\n",ans+m);
return 0;
}
dfs零分,這不應該啊,不可能一點分都沒有啊,所以網站可能有問題
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
int n,p,c,m;
vector<int>g[100005];
int vis[100005];
int ans=-1;
int viss[100005];
void dfs(int to,int step)
{
if(step<=ans) return;
ans=max(ans,step);
for(int i=0;i<g[to].size();i++){
int x=g[to][i];
if(!vis[x]){
vis[x]=1;
dfs(x,step+1);
}
}
}
int main()
{
memset(viss,0x3f3f3f3f,sizeof(viss));
scanf("%d %d %d",&n,&p,&c);
scanf("%d",&m);
for(int i=0;i<p;i++){
int x,y;
scanf("%d %d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
vis[c]=1;
dfs(c,1);
printf("%d\n",ans+m);
return 0;
}