最短路(Dijstra演算法)

2021-07-27 17:49:02 字數 2652 閱讀 3510

一,問題基本概念:

最短路問題:若網路中的每條邊都有乙個數值(長度,時間,成本等),則找出兩點(通常是源節點和阱節點)之間總權和最小的路徑就是最短路問題。

單源最短路:可以採用dijkstra演算法(但是只可以求無負權的最短路徑),時間複雜度為o(|v|^2),如果圖中又負權賄賂,可以採用bellman-ford演算法(但是它回浪費許多時間做不必要的鬆弛),演算法複雜度為o(|v||e|),還可以用spfa演算法進行優化(使用佇列進行的優化),時間複雜度為o(k|e|)。

二,各種演算法:dijstra演算法:

基本思路:1),引數與返回值:dij演算法是單元最短路所以我們需要告訴dij函式你的源點(s)是哪乙個結點,然後函式執行完後dis陣列中存放的就是s到圖中所有結點的最短距離,如果不連通的話會返回極大值。

2),初始化:在初始化過程中我們要定義vis陣列--用來記錄已經訪問過的結點,並且清零。然後給dis陣列賦初值inf(s點為0),表示初始情況下源點到除自己之外的所有點都為無窮大。

3),演算法主體:我們執行n次迴圈,每次從dis陣列中選出乙個值最小的結點標記,並且標記此節點,對這個結點所連線的每一條邊進行鬆弛

if(mindis+map[min][j]

dis[j]=mindis+map[min][j];

三,過程:

每次選擇乙個未訪問過的到已經訪問過(標記為known)的所有點的集合的最短邊,並用這個點進行更新,過程下:

dv為最短路,而pv為前面的頂點。

1.     初始

vknown

dvpvv1f

v2fv3f

v4fv5f

v6fv7f

2.     在v1被標記為已知後的表

vknown

dvpvv1t

v2fv1v3fv4

fv1v5f

v6fv7f

3.     下一步選取v4並且標記為known,頂點v3,v5,v6,v7是鄰接的頂點,而他們實際上都需要調整。如表所示:

vknown

dvpvv1t

v2fv1v3fv4

v4tv1v5fv4

v6fv4v7fv4

4.     接下來選取v2,v4是鄰接點,但已經是known的,不需要調整,v5是鄰接的點但不做調整,因為經過v2的值為2+10=12而長為3的路徑已經是已知的。

vknown

dvpvv1t

v2tv1v3fv4

v4tv1v5fv4

v6fv4v7fv4

5.     接下來選取v5,值為3,v7 3+6>5不需調整,然後選取v3,對v6的距離下調到3+5=8

vknown

dvpvv1t

v2tv1v3tv4

v4tv1v5tv4

v6fv3v7fv4

6.     再選下乙個頂點是v7,v6變為5+1=6

vknown

dvpvv1t

v2tv1v3tv4

v4tv1v5tv4

v6fv7v7tv4

7.     最後選取v6

vknown

dvpvv1t

v2tv1v3tv4

v4tv1v5tv4

v6tv7v7

t

四,演算法所有**:

1

/****************************************

2dijkstra o(n^2) 單元最短路演算法

3鄰接矩陣 45

****************************************

*/6 #include 7 #include 8 #include

9#define inf 0x3f3f3f3f

10#define len 1010

11using

namespace

std;

1213

intmap[len][len], dis[len], n, m;

1415

void dijkstra(int

s)16;18

for(int i=1; i<=n; i++)

19 dis[i] =inf;//初始化為最大值

20 dis[s] = 0;21

for(int i=0; i)

2230 vis[min] = 1;31

for(int j=1; j<=n; j++)

32if(mindis+map[min][j]0

)//進行鬆弛操作

33 dis[j] = mindis+map[min][j];34}

35}3637

38int

main()

39

最短路徑 Dijstra演算法(單源)

定義 所謂最短路徑問題是指 如果從圖中某一頂點 源點 到達另一頂點 終點 的路徑可能不止一條,如何找到一條路徑使得沿此路徑上各邊的權值總和 稱為路徑長度 達到最小。dijkstra 迪傑斯特拉 演算法 他的演算法思想是按路徑長度遞增的次序一步一步併入來求取,是貪心演算法的乙個應用,用來解決單源點到其...

Dijstra演算法 單源最短路徑演算法

用dis陣列記錄起點到其餘所有點的最短路徑 include iostream include cstdio define inf 99999999 using namespace std int map 100 100 int dis 100 int book 100 book陣列記錄那些點已經被利...

最短路 Dijstra演算法和spfa演算法模板

一 dijstra模板 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 輸出乙...