无根树转化成有根树

  在不少题目中会遇到这样一类题:无向连通图 G 有 n 个点,n-1 条边。点从 1 到 n 依次编号.......很明显是个树结构,但是不知道具体的父子关系,这时需要将一棵无根树转化成有根树,具体讲解如下:

  1.树的存储:若点数较大,需要用vector存储

vector<int> G[maxn];
void read_tree(){
       int u,v;
       scanf("%d",&N);
       for(i=1;i<=N-1;i++){
             scanf("%d%d",&u,&v);
             G[u].push_back(v);
             G[v].push_back(u);    
        }           
}

 

  2.转化:转化是由一个dfs完成的,在递归中填补fa[]

void dfs(int u,int father){//确定以u为根的树,father是u的父亲
      int d=G[u].size();
      for(int i=0;i<d;i++){
            int v=G[u][i];
            if(v!=father) //防止倒着再搜回去,进入死循环
                  dfs(v,fa[v]=u); //递归+赋值
      }
}

  3.小细节:初始化的时候令fa[root]=-1,意思是root没有父亲,调用的是dfs(root,-1)

  

原文地址:https://www.cnblogs.com/CXCXCXC/p/4662165.html