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

news2024/11/25 3:00:37

有向图及相关算法

1 有向图的实现

有向图的的应用场景

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

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

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

2 有向图算法

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

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

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

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

    有向图的DFS

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

    BFS的代码完全不用改

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

有向有权图的最短路径

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

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

3 有向图环检测和DAG

原理

无向图中的环的判定方法在有向图中不适用,通过在遍历过程中添加标记即可,递归回退时取消对应顶点的标记
有向图环检测

实现

  • 实现代码
  • 测试代码

有向图环检测的现实意义

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

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

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

举例

有向图的度举例

对Graph类的修改和测试

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

5 有向图求解欧拉回路

和无向图进行比较

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

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

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

寻找欧拉路径的充要条件

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

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

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

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

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

原理

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

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

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

    拓扑排序步骤模拟1

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

    拓扑排序步骤模拟2

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

    拓扑排序步骤模拟3

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

    拓扑排序步骤模拟4

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

    拓扑排序步骤模拟5

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

    拓扑排序步骤模拟6

代码实现侧层面的优化

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

拓扑排序可能无解

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

代码实现

  • 实现代码
  • 测试代码

LeetCode上的相关题目

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

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

用到了图的DFS的后序遍历,自己复习下
DFS后续序历举例

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

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

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

代码实现和测试

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

  • 代码实现和测试

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

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

无向图联通
有向图不联通

有向图的强联通分量

在一个有向图中,任何两点都可达的联通分量就叫强联通分量。如下图中的1、2、3组成强联通分量
强联通分量的含义和举例

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

强联通分量看做一个点
证明:反证法,如果有几个强联通分量看做的点组成了环,那么这个环还可以一个强联通分量,和我们最初的假设"所有的强联通分量各自看做一个点"矛盾。
所有强联通分量各自看做一个点得到的图一定是有向无环图即DAG

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

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

11~12 Kosaraju算法

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

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

Kosaraju算法阐述

Kosaraju算法阐述
举例如下:
Kosaraju算法阐述举例

代码实现:略

后面有需要再搞吧

13 有向图算法总结

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

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

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

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

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

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

有向图特有的问题

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/417767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

肖 sir_就业课__004项目流程(H模型)

项目流程: 一、面试提问(h模型) 1、你说下你们公司测试流程? 2、给你一个需求你会怎么做? 3、你讲下你的工作? 4、谈谈你是如何去测试? 答案:h模型 要求第一人称来写 讲解简化文字流程&#x…

基于Python实现的深度学习技术在水文水质领域应用

目录 一、深度学习的基本概念和发展现状 二、Python系列开源软件包基本用法 三、前馈神经网络模型、原理和代码实现 四、前馈神经网络模型在水质、水位预测中的应用 五、卷积神经网络模原理、结构和应用,与支持向量机进行比较 六、循环神经网络原理与结构 七…

web 页面在浏览器运行eval性能分析和优化

公司有个低代码老项目,里面有一些自定义脚本运行使用了大量的eval 动态运行。 分析 网上对eval 的争论也非常激烈,大部分不建议使用,一些人观点是用不好才导致问题。 eval 是否真的存在效率问题? eval is evil 我们知道new Fun…

定时任务-常用的cron表达式

常用cron表达式例子: (1)0/2 * * * * ? 表示每2秒 执行任务 (1)0 0/2 * * * ? 表示每2分钟 执行任务 (1)0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务 (2)0 15 1…

宝塔设置PHP定时任务实战记录(定时任务、ajax异步刷新API、shell脚本、访问url)

文章目录项目需求生产环境一、php定时任务二、实战开发1.创建mysql数据表2.入库封装函数(1)封装入库(2)入库操作3.定时任务的实现(1)$ajax异步调用法(2)宝塔定时访问url(…

http请求头部(header)详解

通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可 选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个…

OpenShift 4 - 通过 SSH 远程访问 OpenShift Virtualization 的虚拟机

《OpenShift / RHEL / DevSecOps 汇总目录》 说明:本文已经在支持 OpenShift 4.12 的 OpenShift 环境中验证 在《OpenShift 4 - 用 OpenShift Virtualization 运行容器化虚拟机 (视频)》一文中使用了 OpenShift 控制台直接访问运行在 OpenSh…

【Python实战】从架构设计到实现:一个Powerful的图书管理系统

💖 作者简介:大家好,我是Zeeland,全栈领域优质创作者。📝 CSDN主页:Zeeland🔥📣 我的博客:Zeeland📚 Github主页: Undertone0809 (Zeeland) (github.com)&…

栈的压入,栈的弹出,最小栈,用队列实现栈,设计循环队列

栈的压入,栈的弹出 输入两个整数序列,第一个序列表示栈的压入序列,判断第二个序列是否可能是该栈的弹出序列,假设压入栈中的所有数字均不相等,如pushA:1,2,3,4,5是某栈的…

day11 有名管道和无名管道

无名管道基础 进程间的通信 概念: 进程间的通信就是进程和进程之间交换信息; 常用方式: 无名管道(pipe) 有名管道(fifo) 信号(signal) 共享内存(mmap…

DOS批处理文件---内嵌参数变量扩充功能

1 内嵌参数变量 1.1 介绍 内嵌参数变量指:%i,其中i为大于等于0的整数。如%0, %1, %2,... 1.2 作用 可以客制化功能。 1.3 案例 批处理文件:main_Param.bat echo off && setlocal ENABLEDELA…

游戏分析之引擎的基本概念及常见的游戏引擎介绍

一、引擎的基本概念 关于游戏引擎和中间件 过去开发游戏的时候,游戏机生产商提供的只是硬件的规格书和非常基本的“库”。所以,游戏需要的各种程序功能都需要游戏开发团队自己开发。从PC,FC的8位机时代开始,到SFC,MD的…

Java经典笔试题—day01

Java经典笔试题—day01🔎选择题🔎编程题🥝组队竞赛🥝删除公共字符🔎结尾🔎选择题 (1) 在 Java 中,存放字符串常量的对象属于( )类对象。 A. Character B. String C. Str…

类ChatGPT项目的部署与微调(下):从ChatGLM-6b到ChatDoctor

前言 随着『GPT4多模态/Microsoft 365 Copilot/Github Copilot X/ChatGPT插件』的推出,绝大部分公司的技术 产品 服务,以及绝大部分人的工作都将被革新一遍 类似iPhone的诞生 大家面向iOS编程 有了App Store现在有了ChatGPT插件/GPT应用商店&#xff…

Faster-RCNN代码解读5:主要文件解读-上

Faster-RCNN代码解读5:主要文件解读-上 前言 ​ 因为最近打算尝试一下Faster-RCNN的复现,不要多想,我还没有厉害到可以一个人复现所有代码。所以,是参考别人的代码,进行自己的解读。 ​ 代码来自于B站的UP主&#xff…

算法模板(3):搜索(2):bfs与图论基础

bfs 在搜索题中,一般来讲,bfs和dfs都有一个最优选择。 基础bfs 走迷宫 注:这个模板具有还原路径的功能。其实,还可以反向搜(从终点走到起点),就不用 reverse数组了。其实,bfs是不…

Qt Quick - Dialog

Dialog使用总结一、概述二、对话框标题和按钮三、模态对话框四、非模态的对话框五、standardButtons 属性一、概述 对话框是一种弹出式对话框,主要用于短期任务和与用户的简短交流。与ApplicationWindow和Page类似,Dialog被组织成三个部分:header、cont…

PyTorch深度学习实战 | 基于线性回归、决策树和SVM进行鸢尾花分类

鸢尾花数据集是机器学习领域非常经典的一个分类任务数据集。它的英文名称为Iris Data Set,使用sklearn库可以直接下载并导入该数据集。数据集总共包含150行数据,每一行数据由4个特征值及一个标签组成。标签为三种不同类别的鸢尾花,分别为&…

【AI帮我写代码,上班摸鱼不是梦】手摸手图解CodeWhisperer的安装使用

IDEA插件 除了借助ChatGPT通过问答的方式生成代码,也可以通过IDEA插件在写代码是直接帮助我们生成代码。 目前,IDEA插件有CodeGeeX、CodeWhisperer、Copilot。其中,CodeGeeX和CodeWhisperer是完全免费的,Copilot是收费的&#x…

数据分析:麦当劳食品营养数据探索并可视化

系列文章目录 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒关注…