输入一个n个节点的无根树各条边,并指定一个根节点,要求把该树转化为有根树,输出各个节点的父节点编号。
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 1000;
vector<int> G[maxn];
int n;
int p[maxn];
void read_tree()//进行树的边的信息输入
{
int u,v;
cout << "输入边的个数" << endl;
cin >> n;
cout << "输入边的信息(子节点 父节点)" << endl;
for(int i=0;i<n-1;i++)
{
cin >> u >> v;
G[u].push_back(v);//无向
G[v].push_back(u);
}
}
void dfs(int u,int fa)//递归转化u为根的子树,u的父结点为fa
{
int d=G[u].size();//与结点u相邻点的个数
for(int i=0;i<d;i++)
{
int v = G[u][i];//结点u的第i个相邻点v
if(v != fa)
dfs(v,p[v] = u);//把v的父结点设为u,然后递归转化以v为根的子树
}
}
int main()
{
cout << "输入树的信息" << endl;
read_tree();
cout << "设定根节点" << endl;
int root;
cin >> root;
p[root]=-1;
dfs(root,-1);
cout << "转化后边的信息为:" << endl;
for(int i=0;i<n;i++)
cout << i << "的父节点为" << p[i] << endl;
return 0;
}