21.图的应用

news2024/11/16 4:37:06

目录

一. 最小生成树

(1)普里姆(Prim)算法

(2)克鲁斯卡尔(Kruskal)算法

二. 最短路径

(1)Dijkstra(迪杰斯特拉)算法

(2)Floyd(弗洛伊德)算法

三. 拓扑排序

四. 关键路径


一. 最小生成树

生成树:所有顶点均由边连接在一起,但不存在回路的图。

一个图可以有许多棵不同的生成树,所有生成树具有以下共同特点:

  • 生成树的顶点个数与图的顶点个数相同;
  • 生成树是图的极小连通子图,去掉一条边则非连通;
  • 一个有n个顶点的连通图的生成树有n-1条边(反之不成立);
  • 在生成树中再加一条边必然形成回路;
  • 生成树中任意两个顶点间的路径是唯一的;

设图G=(V,E)是个连通图,当从图任一顶点出发遍历图G时,将边集E(G)分成两个集合T(G)和B(G)。其中T(G)是遍历图时所经过的边的集合,B(G)是遍历图时未经过的边的集合。显然,G1(V,T)是图G的极小连通子图。即子图G1是连通图G的生成树。

最小生成树:给定一个无向网络,在该网的所有生成树中,使得各边权值之和最小的那棵生成树称为该网的最小生成树,也叫最小代价生成树。

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

MST性质:设N= (V,E)是一个连通网,U是顶点集V的一个非空子集。若边(u, v)是一条具有最小权值的边,其中u∈U, v∈V-U,则必存在一棵包含边(u, v)的最小生成树。

V-U={V2,V3,V4,V5,V6},连接U,V-U的边有(v1,v2),(v1,v3),(v1,v4),最小的是(v1,v3)=1,则这条边必被包含在这个最小生成树内。

在生成树的构造过程中,图中n个顶点分属两个集合:已落在生成树上的顶点集U和尚未落在生成树上的顶点集V-U,接下来则应在所有连通U中顶点和V-U中顶点的边中选取权值最小的边。

(1)普里姆(Prim)算法

  • 设N=(V,E)是连通网,TE是N上最小生成树中边的集合;
  • 初始令U={u0}, (u0V),TE={ };
  • 在所有uU, vV-U的边(u,v)E中,找一条代价最小的边(u_0,v_0)
  • (u_0,v_0)并入集合TE,同时v_0并入U;
  • 重复上述操作直至U=V为止,则T=(V,TE)为N的最小生成树。

(2)克鲁斯卡尔(Kruskal)算法

  • 设连通网N= (V,E),令最小生成树初始状态为只有n个顶点而无边的非连通图T=(V,{}),每个顶点自成一个连通分量。
  • 在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上(即:不能形成环),则将此边加入到T中;否则,舍去此边,选取下一条代价最小的边。
  • 依此类推,直至T中所有顶点都在同一连通分量上为止。

二. 最短路径

两类问题:(1)求给定两点间的最短路径;(2)某点到其他所有点的最短路径;

单源最短路径—用Dijkstra(迪杰斯特拉)算法;所有顶点间的最短路径—用Floyd(弗洛伊德)算法;

(1)Dijkstra(迪杰斯特拉)算法

基本思路:按路径长度递增次序产生最短路径。首先把V分成两组:S:已求出最短路径的顶点的集合;T=V-S:尚未确定最短路径的顶点集合。然后将T中顶点按最短路径递增的次序加入到S中,保证:(1)从源点v_0到S中各顶点的最短路径长度都不大于从v_0到T中任何顶点的最短路径长度。(2)每个顶点对应一个距离值:S中顶点:从v_0到此顶点的最短路径长度。T中顶点:从v_0到此顶点的只包括S中顶点作中间顶点的最短路径长度。

  • 初始化:先找出从源点v_0到各终点v_k的直达路径(v_0,v_k),即通过一条弧到达的路径。
  • 选择:从这些路径中找出一条长度最短的路径(v_0,u)
  • 更新:然后对其余各条路径进行调整。若在图中存在弧(u,v_k),且(v_0,u)+(u,v_k)<(v_0,v_k),则以路径(v_0,u,v_k)代替(v_0,v_k)。在调整后的各条路径中,再找长度最短的路径,依此类推。

(2)Floyd(弗洛伊德)算法

算法思想:逐个顶点试探,从v_i到v_j的所有可能存在的路径中选出一条长度最短的路径。

三. 拓扑排序

有向无环图:无环的有向图,简称DAG图。有向无环图常用来描述一个工程或系统的进行过程(通常把计划、施工、生产、程序流程等当成是一个工程)。一个工程可以分为若干个子工程,只要完成了这些子工程(活动),就可以导致整个工程的完成。

AOV网(拓扑排序):用一个有向图表示一个工程的各子工程及其相互制约的关系,其中以顶点表示活动,弧表示活动之间的优先制约关系,称这种有向图为顶点表示活动的网,简称AOV网(Activity On Vertex network)。AOV网中不允许有回路(环),因为如果有回路存在,则表明某项活动以自己为先决条件,显然这是荒谬的。

AOE网(关键路径):用一个有向图表示一个工程的各子工程及其相互制约的关系,以弧表示活动,以顶点表示活动的开始或结束事件,称这种有向图为边表示活动的网,简称为AOE网(Activity On Edge)。

AOV网的典型举例:排课表

拓扑排序:在AOV网没有回路的前提下,我们将全部活动排列成一个线性序列,使得若AOV网中有弧<i,j>存在,则在这个序列中,i一定排在j的前面,具有这种性质的线性序列称为拓扑有序序列,相应的拓扑有序排序的算法称为拓扑排序。(网->线性序列)

仍然以上面的例子,根据课程关系排定上课顺序。方法:在有向图中选一个没有前驱的顶点且输出之。从图中删除该顶点和所有以它为尾的弧。重复上述两步进行递归操作,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止。用以上方法可以排出拓扑序列C1,C2,C3,C4,C5,C7,C9,C10,C11,C6,C12,C8,或C9,C10,C11,C6,C1,C12,C4,C2,C3,C5,C7,C8,
一个AOV网的拓扑序列不是唯一的。

利用拓扑有序序列,还可以检测AOV网中是否存在环。对有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环。

四. 关键路径

AOE网的定义见本节第三小节。典型举例是一些事件的安排。例如:准备一个小型家庭宴会,晚6点宴会开始,最迟几点开始准备?压缩哪项活动时间可以使总时间减少?

我们可以把工程计划表示为边表示活动的网络,即AOE网,用顶点表示事件,弧表示活动,弧的权表示活动持续时间。事件表示在它之前的活动已经完成,在它之后的活动可以开始。AOE网有两个特殊点:源点表示整个工程开始(入度为0的顶点),汇点表示整个工程结束(出度为0的顶点)。

关键路径-源点到汇点路径最长(各项活动持续时间最长)的路径。如何确定关键路径,需要以下4个描述量(这里假定全工作不能超过3小时=180分钟):

上图中vi表示事件,ai表示活动
  • ve(vj)——表示事件vj的最早发生时间。例: ve(v1)= 0;ve(v2) = 30
  • vl(vj)——表示事件vj的最迟发生时间。例: vl(v4)= 180-15=165
  • e(i)——表示活动ai的最早开始时间。例: e(a3)= 30
  • l(i)——表示活动ai的最迟开始时间。例: l(a3)= 180-15-45=120
  • l(i) - e(i)——表示完成活动ai的时间余量。例: I(3)- e(3)= 90
  • 关键活动——关键路径上的活动,即l(i)==e(i)(即l(i) - e(i)==0)的活动。

因此要确定关键路径,首先要确定关键活动。设活动ai用弧<j,k>表示,持续时间记为w_{j,k},则有:

(1)e(i)=ve(j);(2)l(i)=vl(k)-w_{j,k}

下面求ve(j)vl(j),思路是从两头递推:

(1)从ve(1)=0开始向后递推(源点的最早发生时间记为0):

ve(j)=Max\left \{ ve(j)+w_{i,j} \right \},\left \langle i,j \right \rangle \in T,2\leqslant j\leqslant n,其中T是所有以j为头的弧的集合。

(2)从vl(n)=ve(n)开始向前递推(汇点的最早发生时间记为0):

vl(i)=Min\left \{ vl(j)-w_{i,j} \right \},\left \langle i,j \right \rangle\in S,1\leqslant i\leqslant n-1,其中S是所有以i为尾的弧的集合。

从左往右相加取最大,从右往左相减取最小。 

讨论:

(1)若网中有几条关键路径,则需加快同时在几条关键路径上的关键活动。如: a11、a10、a8、a7。

(2)如果一个活动处于所有的关键路径上,那么提高这个活动的速度,就能缩短整个工程的完成时间。如:a1、a4。
(3)处于所有的关键路径上的活动完成时间不能缩短太多,否则会使原来的关键路径变成不是关键路径。这时,必须重新寻找关键路径。如:a1由6天变成3天,就会改变关键路径。

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

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

相关文章

Pygame编程(1)初始化和退出模块

初始化和退出模块 pygame使用基础流程 初始化模块设置主屏窗口程序主循环&#xff08;处理键盘、鼠标、游戏杆、触摸屏等事件&#xff09;退出模块终止程序 import sys import pygame from pygame.locals import *# 1.初始化模块 pygame.init()# 2.设置主屏窗口 display pyg…

【精品】基于VUE3的 电商详情 图片显示模块

效果 组件 <template><div class"goods-imgs"><div class"imgs-show"><img :src"mainImage" alt"大图" /></div><ul class"img-thumbnail"><li v-for"(item, index) in image…

freertos之任务调度算法

介绍 所谓调度算法&#xff0c;就是怎么确定哪个就绪态的任务可以切换为运行状态。 通过配置文件FreeRTOSConfig.h的三个配置项来配置调度算法&#xff1a;configUSE_PREEMPTION &#xff08;是否抢占&#xff09; configUSE_TIME_SLICING &#xff08;是否轮转&#xff09; c…

Linux操作系统--常用指令(文件目录类指令)

(1).pwd指令 功能:显示当前工作目录的绝对路径。 如果你使用cd命令进行切换的时候不知道到了哪里,就可以使用该指令输出路径查看。 (2).cd命令 功能:用于切换路径 语法: cd + 路径(路径可以指绝对路径,也可以是相对路径)

记录--一个炫酷的css动画

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 最近有一个需求&#xff0c;要我实现一个动画效果&#xff0c;效果如下 简单分析了一下效果&#xff0c;是一个3d的效果&#xff0c;首先是一个圆&#xff0c;接着是两段圆环&#xff0c;第三层是一堆…

WordPress使用子主题插件 Child Theme Wizard,即使主题升级也能够保留以前主题样式

修改WordPress网站样式&#xff0c;主题升级会导致自己定义设置的网站样式丢失&#xff0c;还需要重新设置&#xff0c;很繁琐工作量大&#xff0c;发现在WordPress 中有Child Theme Wizard子主题插件&#xff0c;使用Child Theme Wizard子主题插件&#xff0c;即使主题升级&am…

uni、js——点击与禁用(不可点击)、动态样式class

案例 没约满的时间可以点击进行选择&#xff0c;约满的就不能选择了。选择完之后变色变字。 核心思想就是创建一个第三方变量存起来&#xff0c;点击谁就存到第三方&#xff0c;在根据这个进行判断。 代码 <template><view class"content"><view cl…

基于JSP+Servlet+Mysql网上商城

基于JSPServletMysql网上商城 一、系统介绍二、功能展示三、其它四.获取源码 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基于JSPServlet的网上商城 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 前端技术&#xff1a;HTML、CSS、…

卷轴模式解析:如何实现用户留存、引流拓客

随着现代技术的不断发展和数字货币市场的日益成熟&#xff0c;越来越多的数字货币项目被推向市场。而消费者需求日益复杂&#xff0c;单一的玩法模式已经不能满足消费者追求更好购物体验的需求。电商平台需要尊重消费者的意愿&#xff0c;满足消费者的多样化需求&#xff0c;这…

vue组装模板(侧边栏+顶部+主体)--项目阶段4

目录 一、前言介绍 二、结构解析 三、页面拆分 &#xff08;一&#xff09;页面拆分 1.侧边栏页面&#xff08;固定&#xff09;--Aside.vue 2.顶部页面&#xff08;固定&#xff09;--Header.vue 3.主体页面&#xff08;不固定的&#xff09;--示例用UserView…

启动metastore服务报错

启动Metastore的时候报错&#xff1a; 简略的报错信息&#xff1a; MetaException(message:Error creating transactional connection factory)Caused by: MetaException(message:Error creating transactional connection factory)Caused by: javax.jdo.JDOFatalInternalExce…

识别图片中的文字

前言 PearOCR 是一款免费无限制网页版文字识别工具。 优点如下&#xff1a; 免费&#xff1a;完全免费&#xff0c;没有任何次数、大小限制&#xff0c;可以无限使用&#xff1b; 安全&#xff1a;全部数据本地运算&#xff0c;所有图片均不会被上传&#xff1b; 智能&#xf…

CRM的销售预测有什么用?如何操作?

销售预测对于销售团队非常重要&#xff0c;它可以估计未来一段时间内的销售量和收入&#xff0c;帮助销售人员制定基于数据的决策&#xff0c;提高销售业绩。CRM可以收集和分析销售数据&#xff0c;并进行销售预测。下面说说&#xff0c;什么是销售预测&#xff1f;CRM如何进行…

Buzz语音转文字安装使用(含Whisper模型下载)

简介&#xff1a; Transcribe and translate audio offline on your personal computer. Powered by OpenAI’s Whisper. 转录和翻译音频离线在您的个人计算机。由OpenAI的Whisper提供动力。 可以简单理解为QT的前端界面&#xff0c;python语言构建服务端&#xff0c;使用Whis…

Vant 4中的van-picker选择总是第一个的解决办法

Vant 4中的van-picker选择总是第一个的解决办法 官方demo <van-fieldv-model"fieldValue"is-linkreadonlylabel"城市"placeholder"选择城市"click"showPicker true" /> <van-popup v-model:show"showPicker" ro…

netty运行一段时间报错:java.io.IOException: 打开的文件过多

报错详细内容如下&#xff1a; java.io.IOException: 打开的文件过多at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:421)at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSo…

APP Binder客户端调用全流程分析

现在要搞明白JAVA层app调用跨进程的Service接口时&#xff0c;它的binder是怎样从Java->jni-->native--->binder驱动的这条链路&#xff1a;就是上图中的左半部分从上至下的流程。所以切入点在于&#xff0c;如app调用另一个进程的Service接口的getString&#xff08;…

Spring集成【MyBatis】和【PageHelper分页插件】整合---详细介绍

一&#xff0c;spring集成Mybatis的概念 Spring 整合 MyBatis 是将 MyBatis 数据访问框架与 Spring 框架进行集成&#xff0c;以实现更便捷的开发和管理。在集成过程中&#xff0c;Spring 提供了许多特性和功能&#xff0c;如依赖注入、声明式事务管理、AOP 等 它所带来给我们的…

安全学习DAY19_小程序信息打点

信息打点-小程序应用&解包反编译&抓包&静态分析&源码架构 文章目录 信息打点-小程序应用&解包反编译&抓包&静态分析&源码架构本节知识&思维导图本节使用到的链接&工具 小程序获取-各大平台&关键字搜索小程序-模版测试上线&源码…

如何开启esxi主机的ssh远程连接

环境&#xff1a;esxi主机&#xff0c;说明&#xff1a;esxi主机默认ssh是不开启的&#xff0c;需要人工手动启动&#xff0c;也可以设置同esxi主机一起开机启动。 1、找到esxi主机&#xff0c;点击“配置”那里&#xff0c;再点击右边的属性&#xff0c;如图所示&#xff1a; …