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

2021-10-01 17:50:05 字數 2840 閱讀 2233

定義

所謂最短路徑問題是指:如果從圖中某一頂點(源點)到達另一頂點(終點)的路徑可能不止一條,如何找到一條路徑使得沿此路徑上各邊的權值總和(稱為路徑長度)達到最小。

dijkstra(迪傑斯特拉)演算法

他的演算法思想是按路徑長度遞增的次序一步一步併入來求取,是貪心演算法的乙個應用,用來解決單源點到其餘頂點的最短路徑問題。

//利用狄克斯特拉(dijkstra)演算法求上圖中0結點到其它結點的最短路徑,單源到單終點

//思想:某點到其他點的最短距離

//將n=(v,e)的所有頂點分成2個組合,第一組s:已經求出最小距離的點,起初只有v0,第二組:尚且為求出最短路徑的終點集合

//按照各個頂點與v0間距遞增的次序,逐個將v-s中的點加入s中,過程中要保持從v0到集合s各頂點的距離長度始終不大於到集合v-s中各頂點的距離長度

//演算法輔助:帶權的鄰接矩陣,源點是v0

// 一維陣列s[i]:記錄從v0到vi是否已經被確定為最短路徑長度,true表示確定

// 一維陣列path[i];記錄從源點到vi當前最短路徑上的前驅:初始化:如果v0到vi有弧,則path[i]=v0,否則為-1

// 一維陣列d[i]:記錄從源點到vi的當前最短路徑長度,初始化如果v0到vi有弧,則d[i]=弧上的權值,否則為無窮大

//s每加入乙個點,多乙個中轉點

//假設v0到vi原來最小路徑為d[i],加入vk後,以vk為中轉的路徑長度為d[k]+g.arc[k][i],if(d[i]>d[i]+g.arc[k][i])->d[i]=d[i]+d.arc[k][i]

//1圖的鄰接矩陣表示法和鄰接表建立無向圖儲存

#include

using

namespace std;

#define maxnum 100

//最大頂點數

圖的鄰接矩陣表示法建立無向圖儲存

#define maxint 32767

//無窮

typedef

char vertype;

//資料型別

typedef

int arctype;

//權值型別

//圖結構型別

typedef

struct

amgraph;

//定位

intlocate

(amgraph g, vertype v1)

return-1

;}

//建立無向圖

bool

createudn

(amgraph &g)

}//開始操作,構造鄰接表

cout <<

"please input arcnum graph "

<< endl;

for(i =

0; i < g.arcnum; i++

)return

true;}

void

show

(amgraph g)

cout << endl;

}}

//dijkstra展示

//利用遞迴,找到前驅等於自己的點,遞迴返回輸出後繼結點

void

showcircle

(amgraph g,

int path,

int v0,

int u)

else

showcircle

(g,path, v0, path[u]);

cout << g.v[u]

<<

" ";

}

//演算法輔助:帶權的鄰接矩陣,源點是v0

// 一維陣列s[i]:記錄從v0到vi是否已經被確定為最短路徑長度,true表示確定

// 一維陣列path[i];記錄從源點到vi當前最短路徑上的前驅:初始化:如果v0到vi有弧,則path[i]=v0,否則為-1

// 一維陣列d[i]:記錄從源點到vi的當前最短路徑長度,初始化如果v0到vi有弧,則d[i]=弧上的權值,否則為無窮大

void

shortpath_dij

(amgraph g,

int v0)

s[v0]

=true

;//將v0加入s

d[v0]=0

;int v =-1

;//初始化結束,開始主迴圈,每次求得v0到某個點vi的最短路徑,將vi加入s

for(i =

1; i < n;

++i)

//列}

s[v]

=true

;//將v加入s中的標誌

for(w =

0; w < n;

++w)}}

cout <<

"please input the source and destination"

<< endl;

char ch1, ch2;

while

(cin >> ch1 >> ch2)

delete

s;s =

null

;delete

path;

path =

null

;delete

d;d=null

;}

int

main()

我這裡只是給**實現,想動態地了解,推薦下面這篇的(有介紹)

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

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

單源最短路徑演算法

簡單介紹 最短路徑演算法是圖演算法中的經典演算法,是用於解決圖中某個頂點到另外乙個頂點所經過路徑的花銷最小 這裡的花銷可能是時間也可能指費用等 dijkstra是用於解決單源最短路徑的經典演算法。圖的儲存方式 鄰接矩陣 在鄰接矩陣中,要獲取某個結點的出度和入讀,是通過掃瞄結點所在臨界矩陣中的行列完成...

最短路(Dijstra演算法)

一,問題基本概念 最短路問題 若網路中的每條邊都有乙個數值 長度,時間,成本等 則找出兩點 通常是源節點和阱節點 之間總權和最小的路徑就是最短路問題。單源最短路 可以採用dijkstra演算法 但是只可以求無負權的最短路徑 時間複雜度為o v 2 如果圖中又負權賄賂,可以採用bellman ford...