是一道无根树转化为有根树的题目,暑假时迷迷糊糊的ac了,其实并没有理解其实质,,今天又重新做了一遍,才知道原来无根树转化为有根树实质就是一个深搜的过程,,把一条路径上的点都找出即可。。。题目:
-
输入
-
第一行输入一个整数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 <iostream>
#include <vector>
#include <string.h>
using namespace std;
const int M=100005;
vector<int> aa[M];
int pp[M];
void dfs(int u,int fa)
{
int d=aa[u].size();
for(int i=0;i<d;++i)
{
int v=aa[u][i];
if(v!=fa)
{pp[v]=u;dfs(v,pp[v]);}
}
}
int main()
{
int kk;
cin>>kk;
while(kk--)
{
memset(pp,0,sizeof(pp));
memset(aa,0,sizeof(aa));
int n,root;
cin>>n>>root;
int a,b;
for(int i=1;i<n;++i)
{
cin>>a>>b;
aa[a].push_back(b);
aa[b].push_back(a);
}
pp[root]=-1;
dfs(root,-1);
for(int i=1;i<=n;++i)
cout<<pp[i]<<" ";
cout<<endl;
}
}