问题描述:
输入n个节点的无根树的各条边,并指定一个根节点,要求把树转换为有根树,输出各个节点的父节点的编号(编号从0开始);(n<=1000000)
分析:
首先要存储这个树,很容易想到用邻接矩阵表示,但是邻接矩阵要占用n*n个元素空间,开不下。所以想到了用vector数组;
在记录父节点的过程中,直接用深搜算法即可,在递归的时候记录父节点。(注意要判断v是否为它的父节点,不然会造成无限递归)
代码:
#include <iostream>
#include <vector>
using namespace std;
const int maxn=1000010;
vector<int> G[maxn];
void dfs(int u,int fa);
int p[maxn];
int main()
{
int u,v,n,i,root;
cin>>n;
for(i=0;i<n-1;i++)
{
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
cin>>root;
p[root]=-1;
dfs(root,-1);
for(i=0;i<n;i++)
cout<<p[i]<<" ";
return 0;
}
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);
}
}
}