22.1-6  给出O(V)时间算法判断有向图G是否存在一个通用汇点(universal sink)。通用汇点指的是入度为|V|-1,出度为0的节点。

思路:

考虑图的邻接矩阵A,假设i为通用汇点,则对于0<=j<n,有A[i][j]=0,且对于所有0<=k<n and k != i,有A[k][i] = 1,注意这里k!=i

相当于在子矩阵A[0..i][0..i]的右边和下边造了一个围墙,最下边全是0,最右边除了右下角外全是1

那么可以令游标从矩阵左上角开始,遇1向下,逢0向右,直到行或列超出矩阵A的界限,注意不是子矩阵。此时若游标所在行没有超出界限,那和这个行号 r 就可能是通用汇点编号。

接下来再根据定义验证 r 是否就是通用汇点。因为可能存在以下的情况:

x x x x 1 x x x
x x x x 1 x x x
x x x x 1 x x x
x x x x 1 x x x
0 0 0 0 0 0 0 0
x x x x 0 x x x
x x x x 0 x x x
x x x x 0 x x x

矩阵第5行所表示的节点显然不是通用汇点。

22.2-7  职业摔跤手划分

思路:可归结为对先广生成树进行着色,相邻层颜色不同。若发现有连接相同颜色节点的回边,则划分失败。发生这种情况,可能是相同层内的节点间有边,若与其他非相邻层间同色节点之间有边。

最后,相同颜色的划分为一组,划分完毕。

22.2-8  树的直径

思路:任意节点出发进行先广遍历,找到最长路径的末端节点u,再从u出发进行先广遍历,最长路径即为树的直径。

22.2-9  无向图G,找出分别以正、反向通过每条边的路径

思路:任意节点出发,深度优先遍历,节点可以访问任意次,但保持每条边只访问一次,在此过程中不断把访问到的边在前进方向末端的节点加入到路径中。每处理完一棵先深生成子树,再把根节点加入到路径。直到处理完的有子树,并返回到根节点。

22.3-13 对于有向图G=(V,E)来说,如果u->v意味着图G至多包含一条从u到v的简单路径,则图G是单连通图。给出算法判断一个有向图是否是单连通图。

注:本题解法参考了http://blog.csdn.net/wdq347/article/details/11096945,涉及到的理论证明不再详述,只列出思路。

首先说简单解法,依次从每个点出发进行DFS,出发前,把全部节点置为白色。每棵DFS树中只要发现forward edge或树内的cross edge,则图G必不是单连通图。

参考文章中给出了对于稠密图的优化解法。

简单来说,就是分别考虑图G的每个强连通分量,利用如下定理判断连通分量是否是单连通图(以下定理来自参考文章)

定理:图G是强连通图且DFS不含有forward edge或cross edge,G不是单连通图当且仅当DFS树满足以下任意一个条件:

(1) 存在点v至少有两条back edge;

(2) 存在点v只有一条back edge,且v的某个子结点x,low[x] <dfn[v]

(3) 存在点v,v至少有两个子结点x,y,low[x] < dfn[v],low[y] <dfn[v]


情况1表示v到某个祖先节点至少有两条路径,图G必不是单连通图;

情况2表示v的某个子节点与v的某个祖先存在路径,再加上v有一条back edge,则v到某个祖先节点(不一定是前面提到的那个祖先节点)存在两条路径;

情况3表示v至少有两个子节点通向了祖先节点,即v到某个祖先节点至少存在两条路径。

可惜的是,文章中给的代码只适用于强连通图或强连通分量,并没有继续处理分量图的过程。

这里补上我对后续处理分量图的理解。分量图,从直观上理解,就是把每个强连通分量分别压缩为一个点后形成的图。需要注意的是,压缩为一个点后,原先这个分量的入边都指向压缩后的点;而分量的出边则都从该点出发。分量图是一个有向无环图,那么就可以直接使用前面提到的简单解法进行求解。

总结一下,对于稀疏图,可直接使用简单解法,复杂度为O(V+E);对于稠密图,可使用参考文章提出的解法,先判断每个强连通分量是否为单连通图,若全是,则再判断分量图是否为单连通图,复杂度为O(V*V)

22.5-7 给定有向图G(V,E),所有结点对之间有单向或双向路径,则图G半连通。请判断一个图是否半连通。

http://blog.csdn.net/wdq347/article/details/9995153 提到了一个引理:有向无环图G(V,E),G是半连通的当且仅当有一条路径,这条路径上有图G中所有点。

接下来提到了解决方法,即先得到图G的分量图,再得到分量图的拓扑序列,若序列中任意相邻两点间有边(方向一定是序列中靠前的节点指向靠后的节点),则分量图是半连通图。又,强连通图也是半连通图,那么原始图每个强连通分量是半连通图,所以原始图也是半连通图。

转载于:https://www.cnblogs.com/venux021/p/7400569.html

算法导论22章 基本图算法习题相关推荐

  1. 算法图解第二章笔记与习题(选择排序)

    算法图解第二章笔记与习题(选择排序) 文章目录 算法图解第二章笔记与习题(选择排序) 2.2 数组和链表 2.2.1 链表 2.2.2 数组 2.2.3 数组和链表的读取.插入和删除操作的时间复杂度 ...

  2. 我眼中的算法导论 | 第一章——算法在计算中的作用、第二章——算法基础

    一个小白的算法学习之路.读<算法导论>第一天.本文仅作为学习的心得记录. 算法(Algorithm) 对于一个程序员来说,无论资历深浅,对算法一词的含义一定会或多或少有自己的体会,在< ...

  3. 算法导论第二章部分习题自我解答

    练习: 2.3-2:去掉合并排序中的哨兵值 #include <iostream> using namespace std; void Merge(int* A, int p, int q ...

  4. 算法导论第九章习题9.2-3

    使用迭代版本的随机选择函数实现选择第i小元素.原理与9.2例题相同,该代码为9.2例题的迭代版实现.具体代码如下: #include<iostream> using namespace s ...

  5. 算法导论2-9章补充几道题

    本篇博文意在对前几章中遗漏的,本人觉得有意思的习题当独拿出来练练手. 1.习题2-4,求逆序对,时间复杂度要求Θ(nlgn) 定义:对于一个有n个不同的数组A, 当i<j时,存在A[i]> ...

  6. 算法导论(22.1):图的表示

    文章目录 杂 两种表示方法 邻接链表 邻接矩阵 无向图 有向图 权重图 图属性的表示 原装Python实现 杂 对图算法进行讨论需要引入一些约定. 给定 图G = (V, E) 当对此图上的算法的运行 ...

  7. 算法导论 2-2 冒泡排序的正确性

    (冒泡排序的正确性)冒泡排序是一种流行但低效的排序算法,它的作用是反复交换相邻的未按次序排列的元素. a. 假设A' 表示BUBBLESORT(A)的输出.为了证明BUBBLESORT正确,我们必须证 ...

  8. 单连通图(算法导论22.3-12)

    注意此处的单连通(singleconnected)指任意两个结点u,v,从u到v至多只有一条简单路径.这个问题作为上星题有难度,对于一次DFS来讲,如果存在forward edge则表明必定不是单连通 ...

  9. 动态规划,java实现算法导论15章钢条切割

    来自浙江理工大学在读研究生Yuner: github地址 个人博客地址 此问题dp式 :rn = max(pi + r(n-1)) 不使用dp,用普通的递归方式来求解 //使用普通的方法来计算钢条切割 ...

最新文章

  1. Leetcode-一篇帖子就够啦
  2. 没有外层实列可以访问_这糕点外层香酥,内馅香甜可口,让人吃一次就爱上了,做起来...
  3. Windows Server 2003 导入Java生成的证书,保证iis对CAS的访问
  4. [SQL实战]之获取所有部门中当前员工薪水最高的相关信息
  5. 100道练习题,玩转Numpy模块!(上)
  6. @Tableau 设计技巧 8.2:tableau官方教程(中文版pdf)
  7. 利用JS实现QQ空间自动点赞
  8. 怎么使用计算机操作鼠标,鼠标操作怎么用?电脑鼠标操作图文教程
  9. mysql教学磁力链_价值1000元的磁力链搜索源码PHP+python+mysql 一键搭建
  10. 文件指针与文件位置指针,文件位置指针相关的库函数
  11. 为什么说跳槽加薪低于30%,等于在“降薪”?
  12. NVIDIA图形处理单元(GPU)驱动安装指南
  13. Linux Kernel Security全景图系列之开篇
  14. 如何读取远程4G网络摄像头的视频流?
  15. python selenuim自动签到京东网页版
  16. 18.10.20日报
  17. CaptureScreenshot捕捉画面截图截屏
  18. hdoj4466题解
  19. CODESYS Development System
  20. DFT和IDFT分析

热门文章

  1. 使用swipecard实现卡片视图左右滑动监听以及点击监听
  2. [转]使用Yii CUploadedFile上传文件(图片)
  3. 终端服务器超过了 最大连接数
  4. 在redhat6.3 安装oracle 11.2.0.1遇到的错误
  5. Android应用的Tab键,来回反复点击会报ANR,是空指针导致的,判空就可以解决
  6. extjs获取当前时间
  7. CMakeList下打印log
  8. java serialization/deserialization (序列化对象自描述)
  9. 重要接口—NavigableSet接口
  10. 解决listview中的textview设置了setMovementMethod导致onItemclick无效的问题