DSA之图(4):图的应用

文章目录

  • 0 图的应用
  • 1 生成树
    • 1.1 无向图的生成树
    • 1.2 最小生成树
      • 1.2.1 构造最小生成树
      • 1.2.2 Prim算法构造最小生成树
      • 1.2.3 Kruskal算法构造最小生成树
      • 1.2.4 两种算法的比较
    • 1.3 最短路径
      • 1.3.1 两点间最短路径
      • 1.3.2 某源点到其他各点最短路径
      • 1.3.3 Dijkstra
      • 1.3.4 Floyd
    • 1.4 拓扑排序
      • 1.4.1 有向无环图DAG
      • 1.4.2 AOV网
    • 1.5 关键路径
      • 1.5.1 求解关键路径

0 图的应用

在这里插入图片描述

1 生成树

生成树:所有顶点均由边连接在一起,但不存在回路的图。
也就是两个条件,顶点条件和边数条件,顶点都要保持连通,边数达到最少,没有回路。
在这里插入图片描述
如右边的图,随便再加一条边就有回路了。在这里插入图片描述
所有生成树都具有以下的共同特点:

  • 生成树的顶点个数与图的顶点个数相同;
  • 生成树是图的极小连通子图,去掉一条边则非连通;
  • 一个有 n n n个顶点的连通图的生成树有 n − 1 n-1 n1条边;
  • 生成树中任意两个顶点间的路径是唯一的;
  • 含有 n n n个顶点 n − 1 n-1 n1条边的图不一定是生成树,如下图所示
    在这里插入图片描述
    因为生成树是连通的,每个顶点都要用边相连,上图是不连通的,有两个连通分量。

1.1 无向图的生成树

生成树要包含所有顶点,那么对图进行遍历,把走过的边全部加入到图当中。
遍历则采用DFS与BFS都可以。在这里插入图片描述

用DFS生成的生成树就是DFS生成树。
在这里插入图片描述
用BFS生成的生成树就是BFS生成树。
在这里插入图片描述

综上
在这里插入图片描述

1.2 最小生成树

在这里插入图片描述
最小生成树:给定一无向网络在该网的所有生成树中,使得各边权值之和最小的那棵生成树称为该网的最小生成树,也叫最小代价生成树。
最小生成树可能是不唯一的。

在这里插入图片描述

1.2.1 构造最小生成树

构造最小生成树的算法很多,其中多数算法都利用了MST(Minimum Spanning Tree)的性质。

MST性质
其实就是贪心算法,不断去找权值最小的边。
N = ( V , E ) N=(V, E) N=(V,E)以目是一个连通网, U U U是顶点集 V V V的一个非空子集。若边 ( u , v ) (u, v) (u,v)是一条具有最小权值的边,其中 u ∈ U , v ∈ V − U u∈U,v∈V-U uU,vVU则必存在一棵包含边 ( u , v ) (u,v) (u,v)的最小生成树。

举例

在这里插入图片描述
现在 U = { v 1 } U=\{v_1\} U={v1},所以 V − U = { v 2 , v 3 , v 4 , v 5 , v 6 } V-U=\{v_2,v_3,v_4,v_5,v_6\} VU={v2,v3,v4,v5,v6},所以 u ∈ U , v ∈ V − U u∈U,v∈V-U uU,vVU当中,其中从 v 1 v_1 v1 v 3 v_3 v3是最小的,权值为1,存在这个权值最小的边,这条边一定会包含在某个最下生成树当中。
在这里插入图片描述

1.2.2 Prim算法构造最小生成树

算法思想:
在这里插入图片描述

1.2.3 Kruskal算法构造最小生成树

相比Prim算法更加贪心,直截了当贪心,前提不成环。这次开始就把所有顶点都加入到最小生成树上面去。不过并不包括边,这时边的集合都是空集,没包含边,彼此之间不连通。
在这里插入图片描述
然后直接在边集合当中选权值最小的边,直接加入。在这里插入图片描述
以此类推,选到所有顶点都连通为止(前提不能形成回路)(n个点,n-1条边)。在这里插入图片描述

1.2.4 两种算法的比较

在这里插入图片描述
Prim是选择点加入的,而Kruskal是选择边的。选择边的时候和顶点数是没关系的。

1.3 最短路径

1.3.1 两点间最短路径

从起点走向终点,并非要n个节点都包括,也并非要n-1条边。在这里插入图片描述
直到找到路径长度最短的一条路径。
这种最短路径也称为单源的最短路径,采用Dijkstra算法。

1.3.2 某源点到其他各点最短路径

在这里插入图片描述
所有顶点的最短路径,统一使用Floyd弗洛伊德算法。

1.3.3 Dijkstra

其时间复杂度为 O ( n 3 ) O(n^3) O(n3)
在这里插入图片描述
按照路径长度递增次序产生最短路径,启发式贪心算法。
在这里插入图片描述
在这里插入图片描述
启发式算法,先找最短的,后面再及时更新,具体过程可以看王老师的视频。

1.3.4 Floyd

其时间复杂度为 O ( n 3 ) O(n^3) O(n3)

算法思想:

  • 逐个顶点试探
  • 从少,到的所有可能存在的路径中
  • 选出一条长度最短的路径

在这里插入图片描述
求最短路径的步骤:
初始时设置一个 n n n阶方阵,令其对角线元素(到自身的路径)为0,若存在弧 < v i , v j > <v_i, v_j> <vi,vj>,则对应元素为权值;否则为 ∞ ∞
逐步试着在原直接路径中增加中间顶点,若加入中间顶点后路径变短,则修改之;否则,维持原值。所有顶点试探完毕,算法结束。

在这里插入图片描述

1.4 拓扑排序

1.4.1 有向无环图DAG

在这里插入图片描述
在这里插入图片描述
AOV网以顶点表示活动;AOE网用弧表示活动(子工程)。
AOV网用来解决拓扑排序,AOE网用来解决关键路径问题。

拓扑排序的一个小例子:
在这里插入图片描述

1.4.2 AOV网

在这里插入图片描述
问题:如何判断AOV网中是否存在回路?

在这里插入图片描述
所有顶点都能加入拓扑排序的话,就一定没有网。

拓扑排序。
将网变成一个线性序列的过程就是拓扑排序。
在这里插入图片描述
拓扑排序的步骤:

  1. 首先构建好AOV网

在这里插入图片描述

  1. 在有向图中选一个没有前驱的顶点且输出(例如C1和C9)
  2. 假设选了C1,在有向图当中删除该顶点和所有以它为尾的弧(C1发出的弧)(即C1与C2,C4,C12的弧)
  3. 重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止在这里插入图片描述

1.5 关键路径

制定计划,查找关键路径。
关键路径就是从源点到汇点路径长度(权值之和)最长(大)的路径。

在这里插入图片描述
按照任务需求,构建有权图。
在这里插入图片描述
举例:
在这里插入图片描述

对于上方AOE网,我们关心两个问题:

  1. 完成整项女程至少需要多少时间?
  2. 哪些活动是影响工程进度的关键?

以上答为关键路径与路径长度。

1.5.1 求解关键路径

四个有用的量:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
求关键路径的步骤:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

机器学习:Bert and its family

Bert 先用无监督的语料去训练通用模型&#xff0c;然后再针对小任务进行专项训练学习。 ELMoBertERNIEGroverBert&PALS Outline Pre-train Model 首先介绍预训练模型&#xff0c;预训练模型的作用是将一些token表示成一个vector 比如&#xff1a; Word2vecGlove 但是对于…

微服务契约测试框架-Pact

契约测试 契约测试的思想就是将原本的 Consumer 与 Provider 间同步的集成测试&#xff0c;通过契约进行解耦&#xff0c;变成 Consumer 与 Provider 端两个各自独立的、异步的单元测试。 契约测试的优点&#xff1a; 契约测试与单元测试以及其它测试之间没有重复&#xff0c…

Google Earth Engine谷歌地球引擎提取多波段长期反射率数据后绘制折线图并导出为Excel

本文介绍在谷歌地球引擎GEE中&#xff0c;提取多年遥感影像多个不同波段的反射率数据&#xff0c;在GEE内绘制各波段的长时间序列走势曲线图&#xff0c;并将各波段的反射率数据与其对应的成像日期一起导出为.csv文件的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engi…

图为科技T501赋能工业机器人 革新传统工业流程

工业机器人已成为一个国家制造技术与科技水平的重要衡量标准&#xff0c;在2019年&#xff0c;中国工业机器人的组装量与产量均位居了全球首位。 当前&#xff0c;工业机器人被广泛用于电子、物流、化工等多个领域之中&#xff0c;是一种通过电子科技和机械关节制作出来的智能机…

浏览器端代理proxy 解决跨域

一.环境:使用expresshttp-proxy-middleware 直接上代码 // include dependencies const express require( express);//node内置的path模块导入 const path require("path")const { createProxyMiddleware } require( http-proxy-middleware); // 需要代理后端服…

行为型设计模式之策略模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

【万字长文】SpringBoot整合SpringSecurity+JWT+Redis完整教程(提供Gitee源码)

前言&#xff1a;最近在学习SpringSecurity的过程中&#xff0c;参考了很多网上的教程&#xff0c;同时也参考了一些目前主流的开源框架&#xff0c;于是结合自己的思路写了一个SpringBoot整合SpringSecurityJWTRedis完整的项目&#xff0c;从0到1写完感觉还是收获到不少的&…

K8s Service网络详解(二)

K8s Service网络详解&#xff08;二&#xff09; Kube Proxy调度模式Kube-proxy IptablesKube-proxy IPVS Service SelectorPod DNS种常见的 DNS 服务Kube-DNSCoreDNSCorefile 配置 DNS 记录DNS 记录 ServiceDNS 记录 PodDNS 配置策略 Pod 的主机名设置优先级 Ingress Kube Pro…

Appium+python自动化(二十五)-获取控件ID(超详解)

简介 在前边的第二十二篇文章里&#xff0c;已经分享了通过获取控件的坐标点来获取点击事件的所需要的点击位置&#xff0c;那么还有没有其他方法来获取控件点击事件所需要的点击位置呢&#xff1f;答案是&#xff1a;Yes&#xff01;因为在不同的大小屏幕的手机上获取控件的坐…

ModStartCMS v6.9.0 后台多标签改进,主题色自动切换修复

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…

Redis学习2--使用java操作Redis

1、java操作Redis库的比较 Redis有各种语言的客户端可以来操作redis数据库&#xff0c;其中java语言主要有Jedis与lettuce &#xff0c;Spring Data Redis封装了上边两个客户端&#xff0c;优缺点如下&#xff1a; 2、使用Jedis操作Redis Jedis使用的基本步骤&#xff1a; 引…

企业服务器数据库被360后缀勒索病毒攻击后采取的措施

近期&#xff0c;360后缀勒索病毒的攻击事件频发&#xff0c;造成很多企业的服务器数据库遭受严重损失。360后缀勒索病毒是Beijingcrypt勒索家族中的一种病毒&#xff0c;该病毒的加密形式较为复杂&#xff0c;目前网络上没有解密工具&#xff0c;只有通过专业的技术人员对其进…

原生html—摆脱ps、excel 在线绘制财务表格加水印(html绘制表格js加水印)

文章目录 ⭐前言⭐html标签&#x1f496;table表格的属性&#x1f496;实现财务报表 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享原生html——绘制表格报表加水印。 背景&#xff1a;解决没有ps的情况下使用前端html制作表格报表。 html介绍 HTML&#xf…

【Android知识笔记】UI体系(一)

Activity的显示原理 setContentView 首先开发者Activity的onCreate方法中通常调用的setContentView会委托给Window的setContentView方法: 接下来看Window的创建过程: 可见Window的实现类是PhoneWindow,而PhoneWindow是在Activity创建过程中执行attach Context的时候创建的…

Kotlin多平台最佳架构指南

在这篇文章中&#xff0c;我们将对 Kotlin 多平台移动端的最佳架构进行深入探讨。在2023年&#xff0c;作为 Android 开发者&#xff0c;我们会倾向于采用 MVVM 架构&#xff0c;因为它简单、灵活且易于测试。而作为 iOS 开发者&#xff0c;我们可能会选择 MVC、Viper 等架构。…

QT基于TCP协议实现数据传输以及波形绘制

这个玩意我做了两个&#xff0c;一个是安卓app&#xff0c;一个是Windows程序。代码并非全部都是由我从无到有实现&#xff0c;只是实现了我想要的功能。多亏了巨人的肩膀&#xff0c;开源万岁&#xff01;&#xff01;&#xff01; 我把程序放到GitHub上&#xff0c;需要的可…

Vue项目如何生成树形目录结构

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、有兴趣的可以关注一手。 前言 项目的目录结构清晰、可以帮助我们更快理顺项目的整体构成。在写文档之类的时候也比较方便。生成树形目录的方式有多种&#xff0c;我这里简单介绍其中一种较为简单的实现 过…

学习数学助手Schooltech Math Resource Studio 7.0 Crack

数学资源工作室 数学工作表生成器&#xff1a;快速轻松地创建数学工作表 使用易于使用的数学工作表生成器软件创建可打印的数学练习工作表。通过练习、谜题、问题等提高数学技能。 瞄准学习需求并激励学生 Math Resource Studio 是个性化数学教学的理想软件解决方案&#xff0c…

【SDOF振荡器的非线性-非弹性多轴时间响应分析】用于SDOF振荡器非线性非弹性时程分析的鲁棒性分析研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 进行SDOF振荡器的非线性非弹性时程分析的鲁棒性分析研究&#xff0c;旨在探究该方法对不同系统参数和分析条件变化的稳定性和可靠性。以下是一…

几百本常用计算机开发语言电子书链接

GitHub - XiangLinPro/IT_book: 本项目收藏这些年来看过或者听过的一些不错的常用的上千本书籍&#xff0c;没准你想找的书就在这里呢&#xff0c;包含了互联网行业大多数书籍和面试经验题目等等。有人工智能系列&#xff08;常用深度学习框架TensorFlow、pytorch、keras。NLP、…