根據無向圖的邊鄰接矩陣求任意一點到其他所有點之間的最短路徑。
直接上代碼:
#include <iostream> #include <cmath> using namespace std; #define INFINITY 1000000000 //存儲無向圖中無邊兩點之間的距離 #define MAX 500 //存儲該無向圖最多的點數為500 long arr[MAX][MAX]; void ShortestPath_DIJ(int n,int v0, int p[MAX][MAX], int D[MAX],long arr[MAX][MAX]) { //計算v0到其他所有點之間的最短路徑。 int v, w, i, j, min; bool final[MAX]; for(v=0; v<n; v++) { final[v]=false; D[v]=arr[v0][v]; for(w=0; w<n; w++) p[v][w]=-1; if(D[v]<INFINITY) { p[v][0]=v0; p[v][1]=v; } } D[v0]=0; final[v0]=true; for(i=1; i<n; i++) { min=INFINITY; for(w=0; w<n; w++) if(!final[w] && D[w]<min) { v=w; min=D[w]; } final[v]=true; for(w=0; w<n; w++) { if(!final[w] && min<INFINITY && arr[v][w]<INFINITY && (min+arr[v][w]<D[w])) { D[w]=min+arr[v][w]; for(j=0; j<n; j++) { p[w][j]=p[v][j]; if(p[w][j]==-1) { p[w][j]=w; break; } } } } } for(int i=0;i<n;i++) //輸出v0到其他所有點之間的最短路徑 { if(i!=v0) { cout<<v0<<"------>"<<i<<": "<<D[i]<<endl; } else { continue; } } } int main() { int n,k; while(true) { cout<<"請輸入點數和邊數:"; cin>>n>>k; for(int m=0;m<n;m++) { for(int r=0;r<n;r++) { if(m==r) { arr[m][r]=0; } else { arr[m][r]=INFINITY; } } } cout<<"請輸入每條邊的鄰接點及所在邊的距離:"<<endl; for(int m=0;m<k;m++) { int i,j,d; cin>>i>>j>>d; arr[i][j]=d; arr[j][i]=arr[i][j]; } int p[MAX][MAX]; int D[MAX]; int v0; cout<<"請輸入起始點:"; cin>>v0; cout<<v0<<"點到其他各個點之間的最短距離為:"<<endl ; ShortestPath_DIJ(n,v0,p,D,arr); } return 0; }
運行結果如下:
提示:如果想要求任意兩點之間的最短路徑,可以修改 ShortestPath_DIJ 函數的參數,增加一個目標點參數,在輸出時只輸出對應的最短距離即可。