最短路徑問題

2022-07-31 07:57:16 字數 1852 閱讀 9109

dijkstra演算法:有權圖的單源最短路

1.最短路必定只經過s中的頂點

如果還存在乙個w在s之外,v0>w必定小於v0>v,但路徑是按照遞增順序生成的,那麼w一定已經收錄了,與前提矛盾。    

2.新收錄乙個v,會影響v的鄰接點的dist值

如果收錄v使得s>w的路徑變短,則s>w的路徑一定經過v,並且v>w有一條邊。如果v>w中間還存在頂點的話,該頂點一定在s之外(s是按遞增順序生成的,v剛被收錄)而w的dist值為只經過s中的頂點。dist[w] = min  

3.過程

1.從v-s中找到dist[i]最小的下標i,收錄到s中

2.更新與i的鄰接點的dist值 

3.v==s時停止

4.**

1

//鄰接矩陣儲存

2#define maxvertexnum 1100

3struct

graphnode4;

9 typedef struct graphnode *mgraph;

1011 vertex findmindist(mgraph graph, int dist, int

collected)

1222}23

if (mindist

24return

minv;

25else

26return

error;27}

2829

bool dijkstra(mgraph graph, int dist, int

path, vertex s)

3042 dist[v] = 0

;43 collected[s] = true;44

45while (1

) 58}59

}60}61

return

true

;62 }

5.時間複雜度

直接掃瞄所有未收錄的頂點 t = o(|v|^2 + |e|)   稠密圖效果好

若用最小堆訪問dist 讀取最小的並更新堆o(log|v|), 但更新dist[w]的值需要插入最小堆o(log|v|)  t = o(|v|log|v| + |e|log|v|) = o(|e|log|v|)  稀疏圖較好 (e和v同乙個數量級,|v|log|v|比|v|^2要好)

若將單源最短路演算法呼叫|v|遍,對於稠密圖t = o(|v|^3 + |e||v|) 對於稀疏圖較好

對於稠密圖有floyd演算法 

floyd演算法:多源最短路演算法

採用dp思想設為從

到的只以

集合中的節點為中間節點的最短路徑的長度。

若最短路徑經過點k,則

;若最短路徑不經過點k,則

。因此,

1

//鄰接矩陣儲存23

bool

floyd(mgraph graph, weighttype d[maxvertexnum], vertex path)412

13for (k = 0; k < graph->nv; k++)

14for (i = 0; i < graph->nv; i++)

15for (j = 0; j < graph->nv; j++)

16if (d[i][k] + d[k][j]

1723

return

true

;24 }

輸出路徑:

遞迴輸出, 先輸出i到k,再輸出k,再輸出k到j路線。

時間複雜度

t = o(|v|^3)

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

Codeup最短路徑 最短路徑問題

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...

最短路徑之最短路徑問題

提交 狀態 討論版 命題人 外部匯入 題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的 任務是找出從一點到另一點之間的最短路徑。輸入共n m 3行,...