一道经典的无根树转有根树模板题。
模板:
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 1000;
int n, p[MAXN];
vector<int> G[MAXN];
//第一种dfs写法:
//不需要对对p进行memset;
void dfs(int u, int fa) {//递归转化为以u为根的子树,u的父亲为fa
int d = G[u].size(); //节点u的相邻点的个数
for(int i = 0; i < d; ++i) { //循环遍历跟这个节点相连接的d个节点。
int v = G[u][i]; //节点u的第i个相邻点v
if(fa != v) dfs(v, p[v] = u); //把v的父亲节点设为u,然后递归转化为以v为根的子树
//一定要判断v是否和其父亲节点相等!
}
}
//第二种dfs写法:用pre代替p;
//之前要对pre[maxn] 进行 memset(pre,0,sizeof(pre));
void dfs(int s)
{
int d=G[u].size();
for(int i=0; i < d;i++)
{
int v=G[u][i];
if(pre[v])
continue;
pre[v]=s;
dfs(v);
}
}
int main() {
cin >> n;
for(int i = 0; i < n-1; i++) { //输入n-1条边
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
int root;
cin >> root; //指定根节点。
p[root] = -1; //设定根节点的父亲节点为-1,代表根节点没有父亲节点。
dfs(root, -1);
for(int i = 0; i < n; ++i) {
cout << p[i] << endl;
}
return 0;
}
AC代码 1 :
#include<cstdio>
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100005;
int T;
int N,s;
int p[maxn];
vector<int> G[maxn];
void DFS(int u,int fa)
{
int d=G[u].size();
for(int i=0;i < d;i++)
{
int v=G[u][i];
if(p[v])
continue;
DFS(v,p[v]=u);
}
}
int main()
{
cin>>T;
while(T--)
{
for(int i=0;i<maxn;i++)
G[i].clear();
memset(p,0,sizeof(p));
cin>>N>>s;
int u,v;
for(int i=0;i<N-1;i++)
{
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
p[s] = -1;
DFS(s,-1);
for(int i=1;i<=N;i++)
printf("%d%c",p[i],i==N? '\n' : ' ');
}
return 0;
}
AC代码 2 :
#include<cstdio>
#include<vector>
#define N 100000+10
using namespace std;
vector<int>G[N];
int p[N];//存储结果
int s,t,n;
void read_tree(){
int u,v;
scanf("%d%d",&n,&s);
for(int i=0 ;i<n-1 ;i++){
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
}
void dfs(int u,int fa){
int d = G[u].size();
for(int i=0 ;i<d ;i++){
int v = G[u][i];
if(v!=fa){//递归条件
dfs(v,p[v]=u);
}
}
}
int main(){
scanf("%d",&t);
while(t--){
//多组数据输入,使用vector之前要clear
//否则会run error
for(int i=0; i<N; i++)
G[i].clear();
read_tree();
p[s] = -1;
dfs(s,-1);
for(int i=1 ;i<=n ;i++){
printf("%d%c",p[i],i==n?'\n':' ');
}
}
return 0;
}