最短路徑—Dijkstra算法
1.定義
Dijkstra(迪傑斯特拉)算法是典型的單源最短路徑算法,用於計算一個節點到其他所有節點的最短路徑。
2.算法描述
1)算法思想:設G=(V,E)是一個帶權有向圖,把圖中頂點集合V分成兩組,第一組為已求出最短路徑的頂點集合(用S表示,初始時S中只有一個源點,以後每求得一條最短路徑 , 就將加入到集合S中,直到全部頂點都加入到S中,算法就結束了),第二組為其余未確定最短路徑的頂點集合(用U表示),按最短路徑長度的遞增次序依次把第二組的頂點加入S中。在加入的過程中,總保持從源點v到S中各頂點的最短路徑長度不大於從源點v到U中任何頂點的最短路徑長度。此外,每個頂點對應一個距離,S中的頂點的距離就是從v到此頂點的最短路徑長度,U中的頂點的距離,是從v到此頂點只包括S中的頂點為中間頂點的當前最短路徑長度。
3.參考代碼
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf = 0x7fffffff;
const int N = 1024; //結點最大數量
int edge[N][N]; //存儲圖
bool visited[N]; //記錄結點是否用於搜索過
int dis[N]; //各結點到源結點的最短距離
void init(int n){
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(i == j) {
edge[i][j] = 0;
}
else{
edge[i][j] = inf;
}
}
dis[i] = inf;
}
memset(visited, false, sizeof(visited));
}
void dijkstra(int source,int n) {
int num = source;
int Min = inf;
visited[num] = true;
for(int i = 1; i <= n; i++) {
dis[i] = min(dis[i],edge[num][i]);
}
for(int i = 1; i<= n-1; i++) {
int Min = inf;
for(int j = 1; j<=n; j++) {
if(visited[j] == false && dis[j] < Min) {
Min = dis[j];
num = j;
}
}
visited[num] = true;
for(int k = 1; k <= n; k++) {
if(edge[num][k] < inf) {
if(visited[k] == false && dis[k] > dis[num] + edge[num][k]){
dis[k] = dis[num] + edge[num][k];
}
}
}
}
}
int main() {
int n,m,source;
scanf("%d%d", &n, &m); //輸入結點數和邊數
scanf("%d", &source); //輸入源結點
init(n);
for(int i = 1; i <= m; i++) {
int Start, End, Distance;
scanf("%d%d%d",&Start, &End, &Distance);
edge[Start][End] = Distance;
}
dijkstra(source,n);
for(int i = 1; i <= n; i++) {
if(i != source)
printf("%d-->%d %d\n", source, i, dis[i]);
}
return 0;
}
最短路徑—Dijkstra算法