首页 > 其他分享 >图的应用(408)

图的应用(408)

时间:2023-05-07 19:46:37浏览次数:41  
标签:路径 最小 时间 关键 应用 权值 顶点 408

最小生成树

定义:生成树包含连通图的所有顶点,以及n-1条边。最小的含义是,边权和最小

性质:

1、最小生成树的树形不唯一。如果图的每条边权都互不相等的时候,该最小生成树的唯一的。

2、最小生成树的边权和是唯一的且最小的。

3、边数为顶点数-1

通用算法:

Prim算法:

1)从任意一个顶点开始,找该点相连的权值最小的边,加入到树T中。

2)从树T中已经得到的点中再找相连的权值最小的边,加入到树T中。

3)一直重复步骤2,直到生成一颗完整的树

时间复杂度:O(V^2),在添加每个点的时候,都走一遍剩下来的点才能选出边权最小的点。不依赖于边长,主要是看点数。

Kruskal 算法:

根据总的边值来构建

1)先对所有的边根据权值进行排序

2)根据排序,选择相应的边的两个点组成连通分量。如果要选的两个点已经在同一个连通分量中,那么就下一条边

3)重复步骤2,直到生成完整的树

时间复杂度:O(ElogE) 

边的总排序是O(Elog(E)),总的需要遍历所有的边,需要O(E)。在判断两个端点是否在一个连通分量中需要用到并查集,a(V),整体为O(E)*a(V)。由于是顺序的,最高的复杂度为O(ElogE)。

 

最短路径

定义:一般计算带权最短路(如果是无权图,那么用BFS就可以写),一般有两种类型:一种是单源最短路:求图中某一顶点到其他各顶点的最短路径。另一种是每对顶点间的最短路径

通用算法:

Dijkstra 算法

不适用于带负权值的图,其他的最短路都可以算

算法步骤:

1)从初始值0开始出发,记S为已经选入的点,V为所有的点

2)从V-S中选出j,j满足当前源点到V-S(即剩余的点)中距离最短的点,并且把j加入到S中。

3)根据选出的j来更新源点到各个点的路径。(包括已经得到的点)

4)重复2-3直到选出所有的点。

时间复杂度:O(V^2)

Floyd算法

主要求两两顶点间的最短距离,可以允许负权值

这里直接上代码:

int d[N][N];
int n,m,k;
void Floyd(){
    for(int k=1;k<=n;k++){//k为中间值
        for(int v=1;v<=n;v++){
            for(int v1=1;v1<=n;v1++){
    //代表从v到v1之间距离的更新
                d[v][v1]=min(d[v][k]+d[k][v1],d[v][v1]);
            }
        }
    }
}    

时间复杂度O(V^3)

有向无环图描述表达式

有向无环图:DAG

对应用树来存储表达式,图可以合并表达式相同的结点。

 

 拓扑排序

AOV网:用DAG来存储一个工程,每个结点表示每个事件。只有当某个节点的入度为0,即不存在前驱节点的时候,才能进行该事件。

拓扑排序算法:

1、首先选择一个没有前驱节点的顶点入队列

2、输出队头,删除以该顶点为起点的有向边,并且把没有前驱节点的顶点入队

3、重复2,直到AOV网为空,或者不存在无前驱节点的顶点(说明存在环)

时间复杂度:邻接表 O(V+E),邻接矩阵O(V^2)

上述的队列写法是BFS来实现,也可以通过栈即DFS来实现(先遍历,入栈的操作放在退出递归前,如果在递归前就输出了的话,就是逆拓扑排序)

如果一个AOV图存在拓扑排序,并且编号经过了从小到大的处理,对应的邻接矩阵一定是三角矩阵。

关键路径

定义:

首先关键路径存在于AOE网,即从普通的AOV网升级为AOE网,每条边加了权值,并且入度和出度为0的顶点都只有一个。

从开头到结尾的路径权值最大的路径,为关键路径。路径上的边成为关键活动。

需要找到关键路径,需要四个参数

1、事件(顶点)的最早发生时间ve(k):即每个顶点最早可以开始的时间。( min(是当前顶点的所有前驱+相应活动),取最大值的原因是只有当前驱节点的最后一个活动完成了,才能开始该事件)

2、事件的最晚发生时间 (从后向前推,为min(当前顶点的所有后驱节点-对应的活动) ,取最小值的原因是如果不去最小的,就会拖慢最后的进度)

3、活动(边)的最早开始时间。(和1相同,相当于最早)

4、活动的最晚开始时间。(边的终点最晚开始时间-边所需要花费的时间)

如果一个活动的3==4,那么该活动为关键活动,把所有的关键活动连接起来,就是关键路径。

注意点:

1、关键路径上的关键活动,如果延长关键活动的时间,一定会推迟最后的时间;如果缩短关键活动的时间,不一定会缩短时间,可能缩短了时间后,该路径不一定是关键路径

2、如果这个网的关键路径不唯一,只有对所有关键路径上的共同的关键活动缩短时间,才能缩短最后的时间

标签:路径,最小,时间,关键,应用,权值,顶点,408
From: https://www.cnblogs.com/yxdsTutorial/p/17379916.html

相关文章

  • 指南针传感器的应用 -- 制作“指南针导航仪”
    项目背景Microbit开发板的指南针传感器可以检测到附近的磁场,它可以感应地球的磁场。通常指南针指向的方向是北方,因此你可以用Microbit制作一个指南针导航仪,帮助人们辨别方向。根据下图可知,当小于45或者大于315时,指南针向北的方向比较准确,所以我们可以设置在这个范围内,显示提示......
  • C#中应用程序集的装载过程详解
    原文:https://blog.csdn.net/chinaherolts2008/article/details/114325104这篇文章主要介绍了C#中应用程序集的装载过程的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧了解程序集如何在C#.NET中加......
  • 《后台开发:核心技术与应用实践》第五章 核心技术与应用实践
    文章目录一、基础知识二、strace1.基础知识2.strace:跟踪系统调用来让开发者知道一个程序在后台做什么事情(1)strace基本用法(2)strace跟踪信号传递(3)统计系统调用:strace-cXXXX(5)输出到其他文件:strace-oXXX(6)每个系统调用所花费的时间:strace-TXXX(7)记录系统调用发生的时间:strace-tXX......
  • C++虚函数详解:多态性实现原理及其在面向对象编程中的应用
    在面向对象的编程中,多态性是一个非常重要的概念。多态性意味着在不同的上下文中使用同一对象时,可以产生不同的行为。C++是一种面向对象的编程语言,在C++中,虚函数是实现多态性的关键什么是虚函数虚函数是一个在基类中声明的函数,它可以被子类重写并提供不同的实现。在C++中,使用关......
  • 图的遍历(408)
    BFS算法概述:创建一个空队列。从某个点开始,找到该点所指向的所有的点并且没有被标记过的,放入队列中,并且对当前的点做标记,表示被遍历过了。再从队列中取出新的点,重复前面的操作。直到队列为空。由于图不一定是连通的,需要遍历1~n个点。要点:BFS类似于树的层次遍历,由于存储的边的......
  • spring-boot-2.0.3应用篇 - shiro集成
    spring-boot-2.0.3应用篇-shiro集成  前言      上一篇:spring-boot-2.0.3源码篇-国际化,讲了如何实现国际化,实际上我工作用的模版引擎是freemaker,而不是thymeleaf,不过原理都是相通的。      接着上一篇,这一篇我来讲讲spring-boot如何整合工作中用到的......
  • Linux系列---【如何根据端口号确定应用是否已启动?并根据端口号定位到程序所在的目录?】
    如何根据端口号确定应用是否已启动?并根据端口号定位到程序所在的目录?方法一(lsof命令)#注意:没有该命令先执行安装命令yuminstalllsof#查看端口是否被占用lsof-i:7080如图,输完没有反应,说明端口未被占用,即应用未启动如图,输完如果有反应,寿命端口已占用,使用pwdx+pid命令即可......
  • 2022最简单方法更新华为鸿蒙3.0系统HarmonyOS 3.0安装谷歌服务框架GMS谷歌应用商店Goo
    原视频:https://www.youtube.com/watch?v=AsAiuMKXOQYGbox谷歌框架官方下载地址:https://www.gboxlab.com/Gbox谷歌框架带谷歌应用商店的旧版本下载:https://www.mediafire.com/file/sj0l50pogpjwjnb/GBox-release-1.3.20.apk/file......
  • Java中栈的创建与其常见的应用场景
    (1)Java中栈的创建方式①使用Stack类Java提供了最容易根据名字想起的Stack类,这也是在Java6以及更早版本常用的方式。Stack<String>stack=newStack<>();//创建一个栈,泛型为String,一般来讲String作为泛型是很安全的stack.push("AAAI");stack.push("KDD");stack......
  • 【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无
    问题描述开发AzureJSFunction(NodeJS),使用mssql组件操作数据库。当SQL语句执行完成后,在Callback函数中执行日志输出 context.log("..."),遇见如下错误:Warning:Unexpectedcallto'log'onthecontextobjectafterfunctionexecutionhascompleted.Pleasecheck......