漂洋过海来看你

Description

BMan和hyx住在一个神奇的国度,这个国度有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。 现在BMan在第S号城市,他经常想起那个一起AC过的队友hyx,记忆它总是慢慢的累积,在他心中无法抹去,可是他并不知道hyx 在哪个城市,所以他决定用尽半年的积蓄漂洋过海去找hyx,现在BMan很想知道如果他想去hyx所在的第X号城市,必须经过的前 一个城市是第几号城市(放心,由于心系队友,BMan是不会选择走重复的路的~)

Input

第一行输入一个整数T表示测试数据共有T(1<=T<=10)组 每组测试数据的第一行输入一个正整数N(1<=N<=1000)和一个正整数S(1<=S<=1000),N表示城市的总数,S是BMan所在城市的编号 随后的N-1行,每行有两个正整数a,b(1<=a,b<=N),表示第a号城市和第b号城市之间有一条路连通。

Output

每组测试数据输N个正整数,其中,第i个数表示从S走到i号城市,必须要经过的上一个城市的编号(其中i=S时,请输出-1)

Sample Input

1 10 1 1 9 1 8 8 10 10 3 8 6 1 2 10 4 9 5 3 7

Sample Output

-1 1 10 10 9 8 3 1 1 8

HINT

因为只有N-1条路,相当于是树,没有环,所以去一个点只有一条路,用BFS搜一遍,记录上一个点就可以了。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <string>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <vector>
 8 using namespace std;
 9 int T, N, S;
10 #define maxn 1010
11 vector <int> mp[maxn];
12 int vis[maxn], pre[maxn];
13 void bfs(){
14     queue <int> q;
15     pre[S] = -1;
16     q.push(S);
17     vis[S] = 1;
18     while(!q.empty()){
19         int u = q.front();
20         q.pop();
21         for(int i = 0; i < mp[u].size(); i++){
22             if(vis[mp[u][i]] == 0){
23                 q.push(mp[u][i]);
24                 pre[mp[u][i]] = u;
25                 vis[mp[u][i]] = 1;
26             }
27         }
28     } 
29 }
30 int main(){
31     scanf("%d", &T);
32     while(T--){
33         scanf("%d%d", &N, &S);
34         for(int i  = 1; i <= N; i++) mp[i].clear();
35         memset(vis, 0, sizeof(vis));
36         memset(pre, 0, sizeof(pre));
37         for(int i = 1; i <= N-1; i++){
38             int a, b;
39             scanf("%d%d", &a, &b);
40             mp[a].push_back(b);
41             mp[b].push_back(a);
42         }
43         bfs();
44         for(int i = 1; i <= N; i++){
45             if(i == 1) printf("%d", pre[1]);
46             else printf(" %d",pre[i]);
47         }
48         printf("\n");
49     }
50     return 0;
51 }

 

posted @ 2015-03-16 16:20  下周LGD该赢了吧  阅读(210)  评论(0编辑  收藏  举报