v0為源點,n為鄰接矩陣的階,edge為鄰接矩陣,maxn為常量,path用來儲存路徑節點的前驅,d用來儲存最短路徑權重和。順便說一下,嚴蔚敏的資料結構中的這個演算法只能儲存最短路徑上的節點,並得不到先後順序。
//從某個點到其餘各點間的最小距離
void dijkstra(int v0, int n, int edge[maxn], int path, int d)
path[v0] = v0;
d[v0] = 0;
final[v0] = true; // final[i]為 true 時,表示i在集合s(已求得最短路徑的終點的集合)中
//開始主迴圈,每次求得v0到某個v頂點的最短路徑,並加v到s中
for (int i = 1; i < n; i++)
if (v == -1)
break;
final[v] = true;
for (int w = 0; w < n; w++) //更新當前最短路徑及距離
if (!final[w] && d[w] > min + edge[v][w]) // if
}// for
}//挑戰程式設計競賽中的這個演算法好像更短
下面用乙個陣列track倒序儲存v0到end點的最短路徑所經過的點,但是若路徑不唯一,這個演算法只能得到乙個解,在路徑最短的前提下,並不嫩保證得到經過節點最少的路徑
int gettrack(int v0, int end, int track, int path)
track[cur - 1] = v0;
return cur; // 從0開始,track倒序儲存路徑,返回走過點數の個數cur
}
zzuwenjie 2017-3-19 22:54:49
**中這樣一句,d[w] = min(d[w], minv + d[v][w]);小心溢位,所以不直接相連的邊距離不能設定為int_max
void dijkstra(int v0, int n, int pic[maxn], int d)
final[v0] = true;
d[v0] = 0;
for (int i = 1; i < n; ++i)
if (u == -1)
break;
final[u] = true;
for (int w = 1; w <= n; ++w)
d[w] = min(d[w], minv + pic[u][w]);
}}
鄭大oj10400海島爭霸
求最短路上的最大值
#include #include #include #include #include #define inf 0x3f3f3f3f
using namespace std;
int n, m;
const int maxn = 112;
int pic[maxn][maxn];
int d[maxn];
bool final[maxn];
void dijkstra(int v0, int n, int pic[maxn], int d)
final[v0] = true;
for (int i = 1; i < n; ++i)
} if (u == -1)
break;
final[u] = true;
for(int w = 1; w <= n; ++w)
if (!final[w])
d[w] = min(d[w], max(d[u], pic[u][w])); }}
int main()
scanf("%d", &m);
while(m-- > 0) }
return 0;
}
單源最短路 Dijkstra演算法
前提 沒有負邊 如果有負邊,可以用此方法檢查是否有負圈 const max v max v 表示邊的權重值 d max v 儲存從起點到每個點的總權重值 bool used max v 表示當前點是否已經訪問完畢 思想 找到乙個已經確定最短距離的點,更新跟它相鄰的點,之後這個點就不用關心了。起點最短...
單源最短路演算法 Dijkstra
dijkstra演算法是單源最短路演算法,可以求解不帶負權邊的圖中,從源點s到其它所有點的最短路。時間複雜度近似o n 2 可以用堆優化。一般用鄰接表,也可用鄰接矩陣。在稠密圖上會有較好的效能表現。include include using namespace std int s,t,n,m,las...
單源最短路 Dijkstra演算法
本文 自王陸的文字,僅作學習使用。dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。問題描述 在無向圖 g v,e 中,假設每條邊 e i 的長度為 w i 找到由頂點 v0 到...