无根树转有根树的一般方法

紫书:P352

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int p[100];
vector<int> G[100];  //邻接表
int n;

void read_tree()
{
    int u,v;
    cin>>n;
    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成为与他相连之边的父节点
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i];
        if(v!=fa) dfs(v,p[v]=u);
    }
}

int main()
{
    while(1)
    {
     read_tree();
     memset(p,0,sizeof(p));
     int root;
     cin>>root;
     p[root]=-1;
     dfs(root,-1);
     for(int i=0;i<=n-1;i++)
        cout<<p[i]<<" ";
     cout<<"\n";
    }
    return 0;
}

测试数据:

8

0 1

0 2

0 3

1 4

1 5

5 6

5 7

1

结果:

1 -1 0 0 1 1 5 5

时间: 2024-08-14 19:52:04

无根树转有根树的一般方法的相关文章

ACM:树的变换,无根树转有根树

题目: 输入一个n个节点的无根树的各条边,并指定一个根节点,要求把该树转化为有根树,输出各个节点的父亲编号. 分析:分析在代码的注释中! #include <iostream> #include <vector> using namespace std; const int MAXN = 1000; int n, p[MAXN]; vector<int> G[MAXN]; void dfs(int u, int fa) { //递归转化为以u为根的子树,u的父亲为fa

无根树转有根树

紫书P352 无根树转有根树,如果节点数n<=10^6,那么邻接矩阵就见不了了.用vector数组,vector数组实际占用空间与n成正比. #include <stdio.h> #include <vector> using namespace std; #define MAXN 1000010 vector<int> G[MAXN]; int n; //n个点,n-1条边 int p[MAXN]; void Build_Tree () { scanf(&quo

再谈树---无根树转有根树( dfs搜索转化+fa数组记录父节点) *【模板】

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <vector> #include <algorithm> #define N 100000+2 using namespace std; //无根树转有根树算法 /* 算法分析:所谓无根树,就是根节点任意的树.我们可以给它确定一个根节点. 我们可以假定认为某一个节点为根节点,然后从该节点开始进行dfs或者bfs

SGU - 134 Centroid 无根树转有根树 + 树形DP

题目大意:给出一个无向图(树),要求你删除掉其中一个点,使剩下的点构成的子树中,节点数最大的那个值达到最小 解题思路:因为给出的是一个无根树,第一个想法就是先把它转成有根树,将1当成根 设sum[i]为以i为根节点的子树有多少个节点,那么sum[1] - sum[i]就相当于是排除了i的所有子节点的另一棵子树的节点总数了 设dp[i]为去掉了i节点后的剩余节点所构成的子树的节点的最大值 那么dp[i] = max(dp[i], sum[son]) son指的是和i相连的子节点 还有另一棵子树,就

【树结构】 无根树转有根树

//输入无根树的结点个数n.输入n-1条边(u, v),输入欲指定的根的编号root,建立以root为根的树 /*可变长数组 一个有maxn行 当时每行长度能够不同的数组 用于表示树中结点间的关系 */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<vector> #include<queue> using namespace std; const int max

LA 2038 战略游戏(树的动态规划基础题/无根树转有根树/树的最大最小结点集)

题目大意就是求树的最小结点集,树上的动态规划基础题,一次深搜就可以解决问题 代码如下: #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #i

树的经典问题和方法

树的经典问题和方法 <算法竞赛入门经典(第2版)>392页 欧拉序列.对有根树t进行dfs(深度优先遍历),无论是递归还是回溯,每次到达一个结点时都将深度记录下来,可以得到一个长度为2n-1的序列,称为t的欧拉序列f(类似于欧拉回路). 为了方便,把结点k在欧拉序列中第一次出现的序号记为pos(k). 有了欧拉序列,lca问题可以在线性时间内化为rmq问题:lca(t,u,v)=rmq(b,pos(u),pos(v)).这里rmq返回的是下标而不是值本身. 这个等式不难理解:从u走到v的过程中

有根树的表达 Aizu - ALDS1_7_A: Rooted Trees

有根树的表达 题目:Rooted Trees Aizu - ALDS1_7_A  A graph G = (V, E) is a data structure where V is a finite set of vertices and E is a binary relation on V represented by a set of edges. Fig. 1 illustrates an example of a graph (or graphs). Fig. 1 A free tre

扩增子分析QIIME2分析实战Moving Pictures

本示例的的数据来自文章<Moving pictures of the human microbiome>,Genome Biology 2011,取样来自两个人身体四个部位五个时间点 进入环境 source activate qiime2-2017.6 退出环境 source deactivate 准备数据 # 创建并进入工作目录 mkdir -p qiime2-moving-pictures-tutorialcd qiime2-moving-pictures-tutorial # 下载实验设