2023-04-09 有向图及相关算法

这篇具有很好参考价值的文章主要介绍了2023-04-09 有向图及相关算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有向图及相关算法

1 有向图的实现

有向图的的应用场景

  • 社交网络中的关注
  • 互联网连接
  • 程序模块的引用
  • 任务调度
  • 学习计划
  • 食物链
  • 论文引用
  • 无向图是特殊的有向图,即每条边都是双向的

改进Graph和WeightedGraph类使之支持有向图

  • Graph类的改动
  • WeightedGraph类的改动

2 有向图算法

有些问题,在有向图中不存在,或者我们通常不考虑

  • floodfill
  • 最小生成树
  • 桥和割点
  • 二分图检测

有些问题,在无向图和有向图中是一样的

  • DFS的代码迁移到有向图完全不用改,测试代码

    2023-04-09 有向图及相关算法

  • BFS的代码迁移到有向图完全不用改,测试代码

    2023-04-09 有向图及相关算法

  • BFS用来求无向无权图最短路径的代码用来求有向无权图也完全不用改

有向有权图的最短路径

无向有权图有负权边一定有负权环;有向有权图有负权边不一定有负权环。所以最短路径问题针对有负权边的无向有权图没有意义,但是对有负权边的有向有权图可能是有意义地。
2023-04-09 有向图及相关算法
上面图片中,左右两边都是有向有权图,左边的图不存在负权环,右边的图就存在负权环,所以有向有权图中有负权边不一定有负权环

  • Bellman-Ford算法测试
  • Floyd算法测试

3 有向图环检测和DAG

原理

无向图中的环的判定方法在有向图中不适用,通过在遍历过程中添加标记即可,递归回退时取消对应顶点的标记
2023-04-09 有向图及相关算法

实现

  • 实现代码
  • 测试代码

有向图环检测的现实意义

现实中很多场景都是追求有向无环图(Directed Acyclic Graph即DAG)

  • 程序模块的循环引用检测
  • 任务调度冲突检测
  • 学习计划

4 有向图的度:入度和出度

举例

2023-04-09 有向图及相关算法

对Graph类的修改和测试

  • 对Graph类的修改
  • 对修改后的Graph类的测试

5 有向图求解欧拉回路

和无向图进行比较

对比项 无向图 有向图
存在欧拉回路的充要条件 每个点的度数为偶数 每个点的入度等于出度

寻找有向图欧拉回路的代码

  • 递归实现
  • 非递归实现
  • 测试代码

寻找欧拉路径的充要条件

主要是无向图和有向图的对比

对比项 无向图 有向图
存在欧拉路径的充要条件 除了两个点(起始点和终止点)两个点的度数为奇数,其余每个点的度数为偶数 除了两个点(起始点和终止点),其余每个点的入度等于出度。这两个点,起始点出度比入度大1,终止点入度比出度大1

6~7 拓扑排序–仅针对有向图

拓扑排序的定义和应用价值

  • 定义:在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点,最终的排序结果就是拓扑排序
  • 价值:当现实中存在图状约束时,要你给出一个约束下可行的图遍历方便,这个时候拓扑排序就用上了~比如选课、选旅游路线等

原理

删除入度为0的顶点,然后删除这个和顶点连接的边,更新剩下顶点的入度;然后再删除剩下顶点中入度为0的顶点,删除这个顶点和这个顶点连接的边,更新剩下顶点的入度…一直到图中没顶点,拓扑排序就完成了,按照删除顺序得到的顶点列表就是拓扑排序结果。

过程模拟(不短寻找、删除和更新入度为0的顶点)

  • 1.初始化计算得到各个顶点的入度inDegrees数组

    2023-04-09 有向图及相关算法

  • 2.删除此时图中入度为0的顶点即顶点0,并删除和顶点0相连的边0->1,更新删除边影响的其他顶点的入度,即把顶点1的入度更新为0

    2023-04-09 有向图及相关算法

  • 3.删除此时图中入度为0的顶点即顶点1,并删除和顶点1相连的边1->21->3,更新删除边影响的其他顶点的入度,即把顶点2的入度更新为1、顶点3的入度更新为0

    2023-04-09 有向图及相关算法

  • 4.删除此时图中入度为0的顶点即顶点3,并删除和顶点3相连的边3->2,更新删除边影响的其他顶点的入度,即把顶点2的入度更新为0

    2023-04-09 有向图及相关算法

  • 5.删除此时图中入度为0的顶点即顶点2,并删除和顶点2相连的边2->4,更新删除边影响的其他顶点的入度,即把顶点4的入度更新为0

    2023-04-09 有向图及相关算法

  • 6.删除此时图中入度为0的顶点即顶点4,此时图中已经没有顶点,拓扑排序完成,上面节点删除的顺序即拓扑排序的结果,即[0, 1, 3, 2, 4]

    2023-04-09 有向图及相关算法

代码实现侧层面的优化

  • 删除边和点不一定要真删除,可以深度clone后只更新入度即可~
  • 使用队列记录当前入度为0的顶点,每次更新入度值时一般会把一个以上的更新后入度为0的顶点放入一个队列,每次从队列中取出一个点作为拓扑排序的下一个定点

拓扑排序可能无解

如下图,相当于1、2、3有循环依赖的关系虽然此时拓扑排序无解,但是正好可以用于有向图的环检测。只有`有向无环图即DAG`才有拓扑排序
2023-04-09 有向图及相关算法

代码实现

  • 实现代码
  • 测试代码

LeetCode上的相关题目

  • 207.课程表
  • 210.课程表2

8~9 拓扑排序的另一种方法,方便后续学习有向图的强联通分量

用到了图的DFS的后序遍历,自己复习下
2023-04-09 有向图及相关算法

重要结论:深度优先后续遍历的逆序就是拓扑排序的结果

缺点是不能做环检测,所以我们给这个算法的图必须是有向无环图

2023-04-09 有向图及相关算法

代码实现和测试

太简单,直接调用前面的图的DFS的后序遍历代码了

  • 代码实现和测试

10~12 有向图的强联通分量

有向图因为有方向,相似的的图对无向图是连通图,对有向图就不是

2023-04-09 有向图及相关算法
2023-04-09 有向图及相关算法

有向图的强联通分量

在一个有向图中,任何两点都可达的联通分量就叫强联通分量。如下图中的1、2、3组成强联通分量
2023-04-09 有向图及相关算法

将所有强联通分量看做一个点,得到的图一定是DAG(有向无环图)

2023-04-09 有向图及相关算法
证明:反证法,如果有几个强联通分量看做的点组成了环,那么这个环还可以一个强联通分量,和我们最初的假设"所有的强联通分量各自看做一个点"矛盾。
2023-04-09 有向图及相关算法

求强联通分量各自含有的点和一共有的强联通分量个数

DFS一旦走入一个强联通分量就出不来(因为每个强联通分量一定是个环,DFS只会在环里绕圈)~~可以作为找到一个强联通分量的标志

11~12 Kosaraju算法

为了解决DFS后序遍历不是我们想要的强联通分量各自分开的结果

我们上来先把原有的图每条边进行反向处理(v->w)变成(w->v),在进行DFS后序遍历的结果就是我们想要地了
2023-04-09 有向图及相关算法

Kosaraju算法阐述

2023-04-09 有向图及相关算法
举例如下:
2023-04-09 有向图及相关算法

代码实现:略

后面有需要再搞吧文章来源地址https://www.toymoban.com/news/detail-451210.html

13 有向图算法总结

在无向图中存在,但是在有向图中不存在或者我们通常不考虑地

  • floodfill
  • 最小生成树
  • 桥和割点
  • 二分图检测

在有向图和无向图中完全一样的算法

  • DFS、BFS
  • 最短路径:Dijkstra
  • 最短路径:Bellman-Ford
  • 最短路径:Floyd

有向图和无向图不一样的算法

  • 有向图的环检测
  • 有向图的度
  • 欧拉回路、欧拉路径

有向图特有的问题

  • 拓扑排序:TopoSort
    • 入度+队列实现
    • 顺便做环检测
    • 时间复杂度O(V+E)
  • 强联通分量
    • Kosaraju算法,简单说就是反图的DFS后续的逆序做CC
    • 时间复杂度是O(V+E)

到了这里,关于2023-04-09 有向图及相关算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于邻接矩阵的有向图的广度优先遍历(BFS)和深度优先遍历(DFS)算法

    概念: 广度优先遍历算法是图的另一种基本遍历算法,其基本思想是尽最大程度辐射能够覆盖的节点,并对其进行访问。 以迷宫为例,广度优先搜索则可以想象成一组人一起朝不同的方向走迷宫,当出现新的未走过的路的时候,可以理解成一个人有分身术,继续从不同的方

    2024年02月06日
    浏览(49)
  • 有向图的拓扑排序

    拓扑排序 。任意给定一个有向图,设计一个算法,对它进行拓扑排序。拓扑排序算法思想:a.在有向图中任选一个没有前趋的顶点输出;b.从图中删除该顶点和所有以它为尾的弧;c.重复上述a、b,直到全部顶点都已输出,此时,顶点输出序列即为一个拓朴有序序列;或者直到

    2024年02月09日
    浏览(35)
  • 用go语言实现一个构建有向图的函数,同时图结构的点和边上都支持添加属性

    当然可以。下面是一个简单的用Go语言实现的有向图构建函数的示例。这个图结构使用map来存储,每个节点都由一个唯一的标识符(id)表示,并且节点和边都可以附加属性。 go 这个示例代码创建了一个有向图,并添加了两个节点(A和B)和一个从A到B的边。每个节点和边都有

    2024年01月20日
    浏览(26)
  • 有向图的强连通分量

    对于一个有向图,连通分量:对于分量中任意两点u,v,必然可以从u走到v,且从v走到u. 强连通分量:极大连通分量。 求出强连通分量后,可以通过将强连通分量缩点的方式,将有向图转化成有向无环图。 求强连通分量的方法:tarjan O(n+m),时间复杂度是线性的 1 . 采用dfs来遍历整

    2024年02月10日
    浏览(27)
  • 公开游戏、基于有向图的游戏

    目录 〇,背景 一,公开游戏、策梅洛定理 1,公开游戏 2,策梅洛定理 3,非有向图游戏的公开游戏 力扣 486. 预测赢家(区间DP) 力扣 877. 石子游戏(退化贪心) 力扣 1140. 石子游戏 II(二维DP) 力扣 1406. 石子游戏 III(数列DP) 力扣 1563. 石子游戏 V(区间DP)  力扣 1686.

    2024年02月09日
    浏览(32)
  • 真题详解(有向图)-软件设计(六十二)

    真题详解(极限编程)-软件设计(六十一) https://blog.csdn.net/ke1ying/article/details/130435971 CMM指软件成熟度模型,一般1级成熟度最低,5级成熟度最高,采用更高级的CMM模型可以提高软件质量。 初始:杂乱无章。 可重复级:建立基本的项目管理过程和跟踪费用项。 已定义(确定)

    2024年02月01日
    浏览(49)
  • 搜索与图论-有向图的拓扑序列

    有向图的拓扑序列就是图的广度优先遍历的一个应用。 若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个 拓扑序列 。(起点在终点的前面) 拓扑序列是针对有向图,无向图是没有拓扑序列的。 有向无环图一定是

    2024年02月01日
    浏览(35)
  • 有向图的邻接表和邻接矩阵

    有向图的邻接表是一种常用的表示方法,用于表示图中各个节点之间的关系。在有向图中,每条边都有一个方向,因此邻接表中的每个节点记录了该节点指向的其他节点。 具体来说,有向图的邻接表由一个由节点和它们的邻居节点列表组成的集合构成。对于每个节点,邻接表

    2024年02月22日
    浏览(29)
  • 使用颜色检测有向图中的循环

    给定一个有向图,检查该图是否包含循环。如果给定的图形至少包含一个循环,您的函数应返回 true,否则返回 false。 例子:   输入:  n = 4, e = 6  0 - 1, 0 - 2, 1 - 2, 2 - 0, 2 - 3, 3 - 3  输出: 是  解释:    

    2024年02月03日
    浏览(31)
  • 二十一、搜索与图论——拓扑序列(有向图)

    拓扑序列定义: 若一个由图中所有点构成的序列 A满足:对于图中的每条边 (x,y),x在 A中都出现在 y之前,则称 A是该图的一个拓扑序列。 人话: 始终满足每条边的起点在终点前面,从前指向后。 注意:如果在有向图中构成一个环,则必定无法构成拓扑结构,也可以证明有向

    2024年02月04日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包