nyoj-20(dfs)

吝嗇的國度

時間限制:1000 ms  |  內存限制:65535 KB
難度:3
描述
在一個吝嗇的國度裏有N個城市,這N個城市間只有N-1條路把這個N個城市連接起來。現在,Tom在第S號城市,他有張該國地圖,他想知道如果自己要去參觀第T號城市,必須經過的前一個城市是幾號城市(假設你不走重複的路)。
輸入
第一行輸入一個整數M表示測試數據共有M(1<=M<=5)組
每組測試數據的第一行輸入一個正整數N(1<=N<=100000)和一個正整數S(1<=S<=100000),N表示城市的總個數,S表示參觀者所在城市的編號
隨後的N-1行,每行有兩個正整數a,b(1<=a,b<=N),表示第a號城市和第b號城市之間有一條路連通。
輸出
每組測試數據輸N個正整數,其中,第i個數表示從S走到i號城市,必須要經過的上一個城市的編號。(其中i=S時,請輸出-1)
樣例輸入
1
10 1
1 9
1 8
8 10
10 3
8 6
1 2
10 4
9 5
3 7
樣例輸出
-1 1 10 10 9 8 3 1 1 8
來源

經典題目

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
#ifdef __int64
typedef __int64 LL;
#else
typedef long long LL;
#endif
#define maxn 100000+10
vector<int>q[maxn];
int n,s;
int num[maxn];
int vis[maxn];
void dfs(int cur)
{
    for(int i=0;i<q[cur].size();i++)//這裏是size,注意
    {
        int v=q[cur][i];
        if(!vis[v])//如果這個點沒有被訪問過,就訪問它
        {
            vis[v]=1;
            num[v]=cur;//這裏就體現出鄰接矩陣的優勢了
            dfs(v);
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&s);
        for(int i=1;i<=n;i++)
            q[i].clear();//記得要清空,clear只是vector纔有的
        int a,b;
        for(int i=1;i<n;i++)
        {
            scanf("%d%d",&a,&b);
            q[a].push_back(b);
            q[b].push_back(a);
        }
        memset(vis,0,sizeof(vis));
        vis[s]=1;num[s]=-1;
        dfs(s);
        for(int i=1;i<=n;i++)
            printf("%d ",num[i]);
        printf("\n");
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章