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.**
15.時間複雜度//鄰接矩陣儲存
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 }
直接掃瞄所有未收錄的頂點 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行,...