吝嗇的國度
時間限制: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;
}