漂洋过海来看你
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 }