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)

      

  • 相关阅读:
    [Re] Spring-4(SourceCode)
    [Re] Spring-3(JdbcTemplate)
    [Re] Spring-2(IOC+AOP)
    [Re] Spring-1(bean)
    08-MyBatis(2)
    08-传输层(7)
    07-传输层(6)
    06-传输层(5)
    05-传输层(4)
    ALS推荐算法
  • 原文地址:https://www.cnblogs.com/CXCXCXC/p/4662165.html
Copyright © 2011-2022 走看看