吝啬的国度(dfs+vector)

吝啬的国度

时间限制: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
题解:vector建图;pre数组记录;
代码:
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<vector>
 4 using namespace std;
 5 const int MAXN=100010;
 6 vector<int>vec[MAXN];
 7 int pre[MAXN],s;
 8 #define mem(x) memset(x,0,sizeof(x))
 9 void dfs(int x){
10     for(int i=0;i<vec[x].size();i++){
11         int b=vec[x][i];
12         if(!pre[b]){
13         pre[b]=x;
14         dfs(b);
15         }
16     }
17 }
18 int main(){
19     int T,N,x,y;
20     scanf("%d",&T);
21     while(T--){
22         scanf("%d%d",&N,&s);
23         mem(pre);
24         for(int i=1;i<=N;i++)vec[i].clear();
25         for(int i=1;i<N;i++){
26             scanf("%d%d",&x,&y);
27             vec[x].push_back(y);
28             vec[y].push_back(x);
29         }
30         dfs(s);
31         pre[s]=-1;
32         for(int i=1;i<=N;i++){
33             if(i!=1)printf(" ");
34             printf("%d",pre[i]);
35         }
36         puts("");
37     }
38     return 0;
39 }

这种方法wa,但是不知道为什么:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<vector>
 4 using namespace std;
 5 const int MAXN=100010;
 6 vector<int>vec[MAXN];
 7 int pre[MAXN],s;
 8 #define mem(x) memset(x,0,sizeof(x))
 9 int print(int x){
10     for(int i=0;i<vec[x].size();i++){
11         int b=vec[x][i];
12         return b;
13     }
14     return -1;
15 }
16 int main(){
17     int T,N,x,y;
18     scanf("%d",&T);
19     while(T--){
20         scanf("%d%d",&N,&s);
21         for(int i=1;i<=N;i++)vec[i].clear();
22         for(int i=1;i<N;i++){
23             scanf("%d%d",&x,&y);
24             vec[y].push_back(x);
25         }
26         for(int i=1;i<=N;i++){
27             if(i!=1)printf(" ");
28             printf("%d",print(i));
29         }
30         puts("");
31     }
32     return 0;
33 }
原文地址:https://www.cnblogs.com/handsomecui/p/4842462.html