zoukankan      html  css  js  c++  java
  • 无根树转化成有根树

      在不少题目中会遇到这样一类题:无向连通图 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)

      

  • 相关阅读:
    23种设计模式
    设计模式中类的关系
    简单工厂模式
    SQL正则表达式
    C#中各种计时器
    C# List 排序
    常见名词解释
    PetaPoco入门
    jQuery UI Dialog
    c# winform 获取当前程序运行根目录
  • 原文地址:https://www.cnblogs.com/CXCXCXC/p/4662165.html
Copyright © 2011-2022 走看看