圖——圖的應用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.pswp.cn/web/45874.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45874.shtml
英文地址,請注明出處:http://en.pswp.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;我們看到了改革的方向。本系統是針對企業或者事業單位甚至一個…