图——图的应用02最短路径(Dijkstra算法与Floyd算法详解),拓扑排序及关键路径

前面介绍了图的应用——01最小生成树章节,大家可以通过下面的链接学习:

图——图的应用01最小生成树(Prim算法与Kruskal算法详解)

今天就讲一下图的其他应用——最短路径,拓扑排序及关键路径。

目录

一,最短路径

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

Dijkstra算法思想

c语言中Dijkstra算法的完整代码: 

2, Floyd(弗洛伊德)算法

 Floyd算法思想:

c语言中Floyd算法的完整代码:

二,拓扑排序

三,关键路径


一,最短路径

两种常见的最短路径问题:

一、 单源最短路径Dijkstra(迪杰斯特拉)算法

二、所有顶点间的最短路径Floyd(弗洛伊德)算法

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

Dijkstra算法思想

1.初始化:先找出从源点v0到各终点vk的直达路径(v0,vk),即通过一条弧到达的路径。

2.选择:从这些路径中找出一条长度最短的路径(v0,u)。

3.更新:然后对其余各条路径进行适当调整,即:

v0到其余各点的最短路径--按路径长度递增次序求解 

1、把V分成两组

(1) S:已求出最短路径的顶点的集合。

(2) T=V -S:尚未确定最短路径的顶点集合。

2、将T中顶点按最短路径递增的次序加入到S中,

保证

(1)从源点v0到S中各顶点的最短路径长度都不大于从v0到T中任何顶点的最短路径长度。

(2)每个顶点对应一个距离值

S中顶点:从v0到此顶点的最短路径长度。

T中顶点:从v到此顶点的只包括S中顶点作中间顶点的最短路径长度。

下面是一个实例——

c语言中Dijkstra算法的完整代码: 

#include <stdio.h>
#include <limits.h>#define V 9// 函数minDistance用于找到距离源节点最近的节点
int minDistance(int dist[], int sptSet[]) {int min = INT_MAX, min_index;// 遍历所有节点,找到距离源节点最近的节点for (int v = 0; v < V; v++)if (sptSet[v] == 0 && dist[v] <= min)min = dist[v], min_index = v;return min_index;
}// 函数printSolution用于打印最短路径
void printSolution(int dist[]) {printf("Vertex \t\t Distance from Source");// 遍历所有节点,打印最短路径for (int i = 0; i < V; i++)printf("%d \t\t %d", i, dist[i]);
}// 函数dijkstra用于计算最短路径
void dijkstra(int graph[V][V], int src) {int dist[V];int sptSet[V];// 初始化距离数组和最短路径集合for (int i = 0; i < V; i++)dist[i] = INT_MAX, sptSet[i] = 0;dist[src] = 0;// 遍历所有节点,计算最短路径for (int count = 0; count < V - 1; count++) {int u = minDistance(dist, sptSet);sptSet[u] = 1;// 更新距离数组for (int v = 0; v < V; v++)if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v])dist[v] = dist[u] + graph[u][v];}printSolution(dist);
}int main() {int graph[V][V] = {{0, 4, 0, 0, 0, 0, 0, 8, 0},{4, 0, 8, 0, 0, 0, 0, 11, 0},{0, 8, 0, 7, 0, 4, 0, 0, 2},{0, 0, 7, 0, 9, 14, 0, 0, 0},{0, 0, 0, 9, 0, 10, 0, 0, 0},{0, 0, 4, 14, 10, 0, 2, 0, 0},{0, 0, 0, 0, 0, 2, 0, 1, 6},{8, 11, 0, 0, 0, 0, 1, 0, 7},{0, 0, 2, 0, 0, 0, 6, 7, 0}};dijkstra(graph, 0);return 0;
}

 结果如下:

 Vertex      Distance from Source
0      0
1      4
2      12
3      19
4      21
5      11
6      9
7      8
8      14

2, Floyd(弗洛伊德)算法

求所有顶点间的最短路径有两种方法:

方法一每次以一个顶点为源点,重复执行Dijkstra算法n次

方法二弗洛伊德(Floyd)算法。

 Floyd算法思想:

1逐个顶点试探;

2𝑣𝑖v_i𝑣𝑗v_j的所有可能存在的路径中

3选出一条长度最短的路径

c语言中Floyd算法的完整代码:

与之前同样使用了“limits”库, "INF"表示两个顶点之间没有路径。使用INT_MAX来表示无穷大,当两个顶点之间没有直接路径时,它们的距离就是无穷大。

#include <stdio.h>
#include <limits.h>#define V 4// 打印最短路径矩阵
void printSolution(int dist[][V]);// Floyd-Warshall算法
void floydWarshall(int graph[][V]) {int dist[V][V], i, j, k;// 初始化距离矩阵for (i = 0; i < V; i++)for (j = 0; j < V; j++)dist[i][j] = graph[i][j];// 三重循环,计算最短路径for (k = 0; k < V; k++) {for (i = 0; i < V; i++) {for (j = 0; j < V; j++) {if (dist[i][k] + dist[k][j] < dist[i][j])dist[i][j] = dist[i][k] + dist[k][j];}}}// 打印最短路径矩阵printSolution(dist);
}// 打印最短路径矩阵
void printSolution(int dist[][V]) {printf("以下是最短路径矩阵:");for (int i = 0; i < V; i++) {for (int j = 0; j < V; j++) {if (dist[i][j] == INT_MAX)printf("%7s", "INF");elseprintf("%7d", dist[i][j]);}printf(" \n");}
}int main() {int graph[V][V] = {{0, 5, INT_MAX, 10},{INT_MAX, 0, 3, INT_MAX},{INT_MAX, INT_MAX, 0, 1},{INT_MAX, INT_MAX, INT_MAX, 0}};// 调用Floyd-Warshall算法floydWarshall(graph);return 0;
}

输出结果: 

 以下是最短路径矩阵:
   0     5     8     9
 INF     0     3     4
 INF  INF     0     1
 INF  INF  INF     0

二,拓扑排序

首先我们需要知道拓扑排序是针对有向无环图(DAG)的,在实例中,我们经常用有向图来描述一个工程或系统的进行过程。一个工程可以分为若干个子工程,只要完成了这些子工程(活动),就可以导致整个工程的完成。

表示活动有两种方式:

AOV网(Activity  On Vertices)—用顶点表示活动的网络,对应拓扑排序算法

AOE网(Activity  On Edges)—用边表示活动的网络,对应关键路径算法

比如教学计划的制定

哪些课程是必须先修的,哪些课程是可以并行学习的

813a3be2128d421087bfe1658d8d3572.png

38b2742be8b1426ca253d0ca2274dcdc.png

AOV网特点

1.若从顶点Vi到顶点Vj有路径(有向边),则Vi 是Vj 的(直接)前驱; Vj 是Vi 的(直接)后继。

2.AOV网不能存在回路。

3.拓扑排序,所有顶点排成一个线性序列。

无环有向图的判断方法: 若网中顶点都在拓扑有序序列中,则AOV-网。不存在环。

拓扑排序算法的思想:重复选择没有直接前驱的顶点。

具体步骤如下: 

1.输入AOV网络。令 n 为顶点个数。

2.在AOV网络中选一个没有直接前驱的顶点, 并输出之;

3.从图中删去该顶点, 同时删去所有它发出的有向边;

重复以上 2、3 步, 直到:

         全部顶点均已输出,拓扑有序序列形成,拓扑排序完成;

         或:

        图中还有未输出的顶点,但已跳出处理循环。这说明图中还剩下一些顶点,它们都有直接前驱,再也找不到没有前驱的顶点了。这时AOV网络中必定存在有向环。

我们仍以教学计划的制定为例分析此过程:

•对学生选课工程图进行拓扑排序,得到的拓扑有序序列为

      C1 , C2 , C3 , C4 , C5 , C6 , C8 , C9 , C7

或  C1 , C8 , C9 , C2 , C5 , C3 , C4 , C7 , C6 

31b26f9a550947cd8d581d01f5a8da5e.png

三,关键路径

        用途:估算工程项目完成时间

        AOE网络:定义结点为事件,有向边的指向表示事件的执行次序。单位是时间(时刻)。有向边定义为活动,它的权值定义为活动进行所需要的时间。

8045c414e31348acb08fb1e8ac408c2b.png

5c892b536ebb4c79a1ef8d598ab61265.png

•   术语:

    源点:表示整个工程的开始点,也称起点(入度为0)。

    收点:表示整个工程的结束点,也称汇点(出度为0)。

9fe1fbecdbd8420cbab322544928daee.png

求解关键路径,我们还需要知道以下概念: 

f3f8def6bf304836b8d878302ebc4b2a.png

 那么该如何求这些值?6ffb4656b9894b47a12741dcb808540c.png

     Ve(j) 及 Vl(j))的求法:

7a9e67218b7e42c1b8517ed568c5294f.png

 我们可以看出,关键路径就是通过加总最长路径上所有活动的持续时间来确定的项目最短完成时间。

下面是另一个例子

991655bc1e2941a39241dcb4ba6e19bf.png

995703f57952446a9c943c09071ca501.png

4dc397c367da41c8a924934b19f1497b.png

因此我们就求出了此活动的关键路径

242c9bfb467749ff90746707f33a02c7.png


图的应用章节就到此结束啦,不知道大家有没有掌握呢?

如果文章对你有用的话请点个赞支持一下吧!

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

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

相关文章

HG/T 3655-2024 紫外光UV固化木器涂料检测

紫外光UV固化木器涂料是指由活性低聚物、活性稀释剂、光引发剂和其他成分组成的水性、非水性紫外光固化木器涂料&#xff0c;主要用于室内用木质地板、家具、装饰板等木器的装饰与保护。 HG/T 3655-2024紫外光UV固化木器涂料检测项目&#xff1a; 测试指标 测试方法 在容器中…

成都亚恒丰创教育科技有限公司 【插画猴子:笔尖下的灵动世界】

在浩瀚的艺术海洋中&#xff0c;每一种创作形式都是人类情感与想象力的独特表达。而插画&#xff0c;作为这一广阔领域中的璀璨明珠&#xff0c;以其独特的视觉语言和丰富的叙事能力&#xff0c;构建了一个又一个令人遐想连篇的梦幻空间。成都亚恒丰创教育科技有限公司 在众多插…

MYSQL设计索引一般需要考虑哪些因素?

在设计MySQL索引时&#xff0c;确实需要综合考虑多个因素以确保索引的有效性和性能优化。以下是您提到的参考思路的详细扩展&#xff1a; 1. 数据量 数据量大小&#xff1a;通常&#xff0c;当表中的数据量超过一定阈值&#xff08;如几百条记录&#xff09;时&#xff0c;创…

Linux——进程概念详解

一、进程的基本概念 在给进程下定义之前&#xff0c;我们先了解一下进程&#xff1a; 我们在编写完代码并运行起来时&#xff0c;在我们的磁盘中会形成一个可执行文件&#xff0c;当我们双击这个可执行文件时&#xff08;程序时&#xff09;&#xff0c;这个程序会加载到内存…

动手学深度学习6.3 填充和步幅-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;填充和步幅_哔哩哔哩_bilibili 代码实现_哔哩哔哩_bilibili 本节教材地址&#xff1a;6.3. 填充和…

如何在 Ubuntu 14.04 服务器上使用 Nginx 安装和保护 phpMyAdmin

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 像 MySQL 这样的关系型数据库管理系统在许多网站和应用程序中都是必不可少的。然而&#xff0c;并非所有用户都习惯通过命令行来管…

oracle数据库,怎么分页查询

项目场景&#xff1a; 使用oracle数据库&#xff0c;怎么分页查询 问题描述 平常使用的最多的是MySQL DB, 用的是 limit 语句&#xff1b;Oracle DB, 没有 limit 语句&#xff1b; 原因分析&#xff1a; 解决方案&#xff1a; SELECT * FROM (SELECT t.*, ROWNUM rn FROM…

java算法day16

java算法day16 112 路径总和404 左叶子之和513 找树左下角的值 112 路径总和 题型判定为自顶向下类型&#xff0c;并且为路径和类型。 那就套模板。 自顶向下就是从上到下处理&#xff0c;那么就是前序遍历的思想。 class Solution {boolean res false;public boolean hasP…

自建Web网站部署——案例分析

作者主页: 知孤云出岫 目录 作者主页:如何自建一个Web网站一、引言二、需求分析三、技术选型四、开发步骤1. 项目初始化初始化前端初始化后端 2. 前端开发目录结构示例代码App.jsHome.js 3. 后端开发目录结构示例代码app.jsproductRoutes.jsProduct.js 4. 前后端连接安装axio…

泛微e-cology WorkflowServiceXml SQL注入漏洞(POC)

漏洞描述&#xff1a; 泛微 e-cology 是泛微公司开发的协同管理应用平台。泛微 e-cology v10.64.1的/services/接口默认对内网暴露&#xff0c;用于服务调用&#xff0c;未经身份认证的攻击者可向 /services/WorkflowServiceXml 接口发送恶意的SOAP请求进行SQL注入&#xff0c;…

语音合成新篇章:Transformer模型的革新应用

语音合成新篇章&#xff1a;Transformer模型的革新应用 语音合成技术&#xff0c;又称文本到语音&#xff08;Text-to-Speech, TTS&#xff09;技术&#xff0c;一直是人工智能领域的重要组成部分。随着深度学习技术的飞速发展&#xff0c;Transformer模型凭借其卓越的处理序列…

飘雪的冬天,命运的交织

北风呼啸,天空中飘着鹅毛般的大雪,这又是一个飘雪的冬天。京都医院洁白的病床上躺着一个年轻女孩,她的脸上没有一丝血色,眼睛深深地凹了进去,看上去已经病入膏肓。病房的窗口边,一位身心俱疲的年轻男孩,望着病房外满天飞舞的雪花,思绪不由回到了三年前的林州市…… 一…

使用JS和CSS制作的小案例(day二)

一、写在开头 本项目是从github上摘取&#xff0c;自己练习使用后分享&#xff0c;方便登录github的小伙伴可以看本篇文章 50项目50天​编辑https://github.com/bradtraversy/50projects50dayshttps://github.com/bradtraversy/50projects50days有兴趣的小伙伴可以自己去gith…

面向对象七大原则

学习目标 了解面向对象七大原则基本概念。 在之后实践应用中&#xff0c;要给予七大原则去设计程序。 为什么有七大原则 七大原则总体要实现的目标是&#xff1a; 高内聚、低耦合。 使程序模块的可重复性、移植性增强。 高内聚低耦合 从类角度来看&#xff0c;高内聚低…

如何在Linux上部署Ruby on Rails应用程序

在Linux上部署Ruby on Rails应用程序是一个相对复杂的过程&#xff0c;需要按照一系列步骤进行。下面是一个基本的部署过程&#xff0c;涵盖了从安装所需软件到部署应用程序的所有步骤。 安装必要的软件 在部署Ruby on Rails应用程序之前&#xff0c;需要确保Linux系统上安装了…

android 嵌套webview,软键盘遮挡输入框

实际项目中&#xff0c;android需要加载h5&#xff0c;经常遇到软键盘遮盖输入框的情况&#xff0c;h5测试的时候&#xff0c;是没问题的&#xff0c;但是在APP中是不能把页面推上去。经测试完美解决了这个问题。 1. oncreate *************************** try {web();layout…

掌握Xcode Storyboard:iOS UI设计的可视化之旅

掌握Xcode Storyboard&#xff1a;iOS UI设计的可视化之旅 在iOS应用程序开发的世界中&#xff0c;用户界面&#xff08;UI&#xff09;设计是吸引用户的关键。Xcode的Storyboard功能为开发者提供了一个强大的可视化工具&#xff0c;通过拖放的方式快速构建和管理UI。本文将深…

AI网络爬虫023:用deepseek批量提取天工AI的智能体数据

文章目录 一、介绍二、输入内容三、输出内容一、介绍 天工AI的智能体首页: F12查看真实网址和响应数据: 翻页规律: https://work.tiangong.cn/agents_api/square/sq_list_by_category?category_id=7&offset=0 https://work.tiangong.cn/agents_api/square/sq_list_b…

08 模型演化根本 深度学习推荐算法的五大范式

易经》“九三&#xff1a;君于终日乾乾&#xff1b;夕惕若&#xff0c;厉无咎”。九三是指阳爻在卦中处于第三位&#xff0c;已经到达中位&#xff0c;惕龙指这个阶段逐渐理性&#xff0c;德才已经显现&#xff0c;会引人注目&#xff1b;但要反思自己的不足&#xff0c;努力不…

基于 SSH 的任务调度系统的设计与实现

点击下载源码 基于SSH的任务调度系统的设计与实现 摘 要 随着科学技术的飞速发展和各行各业的分工愈发明细化&#xff0c;对于改革传统的人工任务调度方式的呼声越来越大。得益于快速发展的计算机技术&#xff0c;我们看到了改革的方向。本系统是针对企业或者事业单位甚至一个…