无根树转化成有根树

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

  

时间: 2024-10-19 20:06:01

无根树转化成有根树的相关文章

11.1.1 无根树转化为有根树

题目说的就是,给n个节点和n-1条边,然后,你能够把他组成一棵树,然后我现在指定了某个节点,让这个节点成为root,输出以这个节点为根的树中所有节点的父亲节点. 思路: 这道题就是说,我先给你了一个n个节点,n-1条边的树,然后,让你通过对这个树的转化,使得他成为另外一个不破坏边的关系的树. 其实想法很简单,用vector<int>G[max] 来存储这个树,如果用邻接矩阵的话,空间复杂度是O(n^2),而,如果我们vector的话,内存的占用空间与n是线性增加的, 下来就是dfs 的过程了,

iOS开发之---将时间戳,转化成时间字符串。

1.将一个NSDate,转化成时间字符串. NSDate *date = [NSDate date]; NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"yyyy-MM-dd"; NSString *dateStr = [fmt stringFromDate:date];

将华氏温度转换成摄氏温度或将摄氏温度转化成华氏温度。(需考虑多种不合法的情况尽量转化为合法的)

//华氏温度与摄氏温度转换,编写一个程序,将华氏温度转换成摄氏温度或将摄氏温度转化成华氏温度. //要求程序运行时从控制台读入温度值及单位,并输出另一种温度值及单位,例如:若用户输入27 C则 //程序输出 81F:若用户输入96 F,则程序输出36 C(其中C代表摄氏温度,F代表华氏温度),华氏温度与摄氏温度转化的公式为: //C = 5 (F - 32) / 9 //F = 9 C / 5 + 32 //要求输入的温度值是整数,输出的温度值也是四舍五入后的整数. package 第三天_练习

JSON数据转化成模型

JSON数据转化成模型 // 1.创建url NSURL *url = kSUNUrl(@"video"); // 2.创建request NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3.发送请求数据 NSOperationQueue *queue = [NSOperationQueue mainQueue]; [NSURLConnection sendAsynchronousRequest:request

如何将别人的知识转化成自己的知识?

不传授具体的知识,只告诉你获得知识的方法.将别人的知识转化成自己的知识,成就你的丰盈人生! 由知识管理中心(Knowledge Management Center)基于最新知识管理理论和实践.认知与学习理论,结合互联网对于信息和知识整合.传播.创造的影响所开发的"KMC高效学习方法网络课程"已经在众多同学学习的基础上.结合多位专家的建议进行了重大升级. [课程名称]KMC 高效学习方法网络课程–互联网思维下的高效学习方法 [课程导师]田志刚 知名知识管理专家.个人知识管理畅销书<

UVA 11054 The Necklace 转化成欧拉回路

题意比较简单,给你n个项链碎片,每个碎片的两半各有一种颜色,最后要把这n个碎片串成一个项链,要求就是相邻碎片必须是同种颜色挨着. 看了下碎片总共有1000个,颜色有50种,瞬间觉得普通方法是无法在可控时间内做出来的,因为碎片到底放哪里以及是正着放还是反着放都是不可控的. 这个时候数学建模就真的好重要了,如果我们能把颜色作为节点,一个碎片就表示两个节点连了一条路,那其实就是走了一遍欧拉回路,就意味着项链做成了. 太叼了,这个思想真心不错...LRJ书上的提示,否则我还真是想不到可以这样. 不过还有

laravel 将数组转化成字符串 再把字符串转化成数组

这是在给阮少翔改代码的时候用的方法, 开始的数据用explored转化成数组不是想要的结果, 我就自己写了一个方法把有用的信息提取出来拼接成一个字符串, 再用explored将字符串转化成数组.   方法有点笨, 但是最后是解决了阮少翔的问题 $re1 = DB::table('admin_user') ->join('admin_role_user','admin_user.id','=','admin_role_user.user_id') ->select('admin_role_use

( # #@ ## 在define中的应用)或( 连接两个字符串或者两个数字、强制转化成单引号、强制转化成双引号 )附加字符串强制转化成数字

1. 修改成常用的几个连接表示L与x连接. 以下来自网络:#define Conn(x,y) x##y#define ToChar(x) #@x#define ToString(x) #x x##y表示什么?表示x连接y,举例说:int n = Conn(123,456); 结果就是n=123456;char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";怎么样,很神奇吧 再来看#@x,其实就是给x

在实际项目中实现把swf资源里面的MC进行转化成按钮,实现代码的复用

下面是前不久一个游戏项目中的一小部分内容,拿出来只是为了说明,用AS3对加载进程序中swf内容进行封装变换处理 下面是这个例子,只不过不完整... package com.ctrlcc.sanguo.view { /** * C-公会转盘-视图-主视图 */ public class ZhuanPanView extends Window { private var _panel:MovieClip; private var _closeBtn:EButton; private var _buy