题目解析:从起点进行开始,首先找到一个与起点相连的没有父节点的结点,然后深搜下去,每次深搜的都是与当前节点相连的没有父节点的结点。
代码如下:
01.
#include<stdio.h>
02.
#include<string.h>
03.
#include<vector>
04.
using
namespace
std;
05.
int
pre[100010];
//用来保存每个结点的父节点
06.
vector<
int
>v[100010];
07.
void
dfs(
int
cur)
08.
{
09.
for
(
int
i=0;i<v[cur].size();i++)
//vector的纵行里面存的是与cur相连的结点
10.
{
11.
if
(pre[v[cur][i]])
continue
;
//寻找与当前结点相连的没有父节点的结点,然后沿着这个结点深搜下去。
12.
pre[v[cur][i]]=cur;
13.
dfs(v[cur][i]);
14.
}
15.
}
16.
int
main()
17.
{
18.
int
icase;
19.
scanf
(
"%d"
,&icase);
20.
while
(icase--)
21.
{
22.
int
n,s;
23.
scanf
(
"%d%d"
,&n,&s);
24.
memset
(v,0,
sizeof
(v));
25.
for
(
int
i=1;i<=n-1;i++)
26.
{
27.
int
a,b;
28.
scanf
(
"%d%d"
,&a,&b);
29.
v[a].push_back(b);
30.
v[b].push_back(a);
31.
}
32.
memset
(pre,0,
sizeof
(pre));
33.
pre[s]=-1;
// 起点没有父节点
34.
dfs(s);
35.
for
(
int
i=1;i<=n;i++)
36.
{
37.
if
(i==n)
38.
printf
(
"%d\n"
,pre[i]);
39.
else
40.
printf
(
"%d "
,pre[i]);
41.
}
42.
}
43.
return
0;
44.
}