1. 程式人生 > >1380:分糖果(candy)

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;
}