一个n(n<=1000000)个结点的无根树的各条边,并指定一个根结点,要求把树转化为有根树。
输入:结点的数目n,无根树的各条边,输入一个根结点号。
输出:各个结点的父亲编号。
运行结果:
算法实现:
为方便起见,我们用了STL中的vector来保存边,G[u]表示u结点的相邻结点的编号。
树的存储结构定义:
vector<int> G[maxn]; //邻接矩阵表示
int p[maxn], n; //结点i个父节点编号 结点数目
输入树:
void read_tree()
{
//输入树
int i, u, v;
scanf("%d", &n);
for(i = 0; i < n-1; i++)
{
scanf("%d %d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
}
递归转化以u为根的子树,u的父结点为fa.
void dfs(int u, int fa) //递归转化以u为根的子树,u的父结点为fa
{
int i, d, v;
d = G[u].size(); //结点为u的相邻点个数
for(i = 0; i < d; i++)
{
v = G[u][i]; //结点u的第i个相邻点v
if(v != fa) //判断v是否与父结点相等
dfs(v, p[v] = u); //把v的父结点设为u,然后递归转化为以v为根的子树
}
}