- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
图论基础
(版
刘汝佳
目录
一、宽度优先遍历
二、深度优先遍历
三、最短路问题
四、最小生成树问题
一、宽度优先遍历
例1. 二分图判定
• 给出判断图是否为二分图的线性时间算法
例2. 树的直径
• 一棵树T 的直径定义为结点两两间距离的最
大值. 给出求树直径的线性时间算法
例3. 幼儿园小朋友分组
• 幼儿园里有n个小孩。不幸的是小孩常常打
架。每个小孩有不超过3个仇敌。是否有可
能将所有小孩分成两组使得每个小孩最多
和他的一个仇敌同组?
分析
• 这道题目可以看作是给所有的点黑白二染
色。先给1染黑色,放入队列。每次从队列
中取出一个点,把与其相邻的还未染色的
点染成相反的颜色(因为不同的连通分量
之间互不相干,可以假设所有点构成一个
连通图),这样一次广搜就能给所有的点
一个初始色。如果发现某个点x有两个以上
的仇敌与它染同样的颜色,就把x 的颜色变
一下。如此反复就能求得答案。
• 问题1: 这样变是不是总能得到答案?
• 问题2: 这样做的时间复杂度是多少?
重要结论
• 有一个重要的结论:一个点颜色至多变一
下。也就是说不会出现某个点的颜色反复
变的情况。假如这个结论成立,则上面提
出的两个问题都能解决
– 由于不会反复变,在有限步内(至多n步)就
不能继续变了,这时的状态就是答案
– 每个点至多变一次,所以时间复杂度是O(n)
证明
• 我们用广搜给每个点初始色,于是形成了一颗搜
索树,深度为奇数的点染黑色、深度为偶数的点
染白色。如果一个点x存在两个以上的仇敌和它染
同样的颜色,我们称x是一个“坏点” 。
• 任意一个非叶子结点显然不是一个坏点。首先是
根结点R,由于我们采用的是广搜,所有与R有仇
的点都被染成了白色(R是黑色),所以R必然不
是坏点。对于任意一个非根、非叶子结点p ,都存
在一个父亲和至少一个孩子,所以p就至少有两个
仇敌与它染不同颜色;而题目中说每个人至多3个
仇敌,故而与p染同色的p 的仇敌至多一个,因此
p也不是坏点。
• 所以: 坏点必然是叶子结点!
坏点
• 设某个坏点x ,与它染同色的两个仇敌是a,b (显
然a,b都不是根结点)。我们把x反色,就相当于
令x成为a的孩子。需证明x 的颜色不可能再次改变
• x改色的必要条件是a,b 中至少有一个改色。由于
x成为了a的孩子,a不是叶子结点,因此a不可能
在x之前改色,所以必然是b改色。设b的父亲是
t,那么t与x这两个b的仇敌都和b染不同的颜色,
要想使得b改色,必须先把t,x两者至少一个改
色。而t不是叶子结点,所以必须把x改色才有可
能让b改色。
实现
• 归纳:x改色前b要改色;b改色前x要改
色。这显然是一个不可能的任务。于是x 的
颜色不会被第二次改变(具体地说a,b的
颜色也不会改变)。
• 具体实现的时候把所有的坏点放在一个栈
里面,每次取一个点如果还是坏点就反
色,同时考察所有与之相邻的点,看看是
不是变成了坏点,如果是就放入栈中。总
的时间复杂度是O(n)。
二、深度优先遍历
• 新发现的结点先扩展
• 得到的可能不是一棵树而是森林, 即深度优先森林
(Depth-first forest)
• 特别之处: 引入时间戳(timestamp)
– 发现时间d[v]: 变灰的时间
– 结束时间f[v]: 变黑的时间
– 1=d[v]
文档评论(0)