1. 程式人生 > >4003.基於Dijsktra演算法的最短路徑求解

4003.基於Dijsktra演算法的最短路徑求解

基於Dijsktra演算法的最短路徑求解

釋出時間: 2018年11月26日 10:14   時間限制: 1000ms   記憶體限制: 128M

有趣的最短路...火候欠佳,目前還很難快速盲打出來,需繼續練習。唉....我這暑假都幹了些啥orz.(馬上考四級,練習一下我蹩腳的英語,各位莫笑儂)

一張地圖包括n個城市,假設城市間有m條路徑(有向圖),每條路徑的長度已知。給定地圖的一個起點城市和終點城市,利用Dijsktra演算法求出起點到終點之間的最短路徑。

多組資料,每組資料有m+3行。第一行為兩個整數n和m,分別代表城市個數n和路徑條數m。第二行有n個字元,代表每個城市的名字。第三行到第m+2行每行有兩個字元a和b和一個整數d,代表從城市a到城市b有一條距離為d的路。最後一行為兩個字元,代表待求最短路徑的城市起點和終點。當n和m都等於0時,輸入結束。

每組資料輸出兩行。第一行為一個整數,為從起點到終點之間最短路的長度。第二行為一串字串,代表該路徑。每兩個字元之間用空格隔開。

3 3
A B C
A B 1
B C 1
A C 3
A C
6 8
A B C D E F
A F 100
A E 30
A C 10
B C 5
C D 50
E D 20
E F 60
D F 10
A F
0 0
2
A B C
60
A E D F
 1 #include<iostream>
 2 using namespace std;
 3 #define
maxn 200 4 #define inf 1e9 5 6 int n; 7 char v[maxn];//v[A]==1; 8 int Hash[maxn];//build char index's hash list <char,int> 9 int e[maxn][maxn];//direct distance between two point 10 int dis[maxn];//dis from start 11 int path[maxn];//path=point which is the passing 12 int visit[maxn];//1 present has visited
13 14 void Dijkstra(int x) 15 {//x is start 16 int k, min; 17 for (int i = 1; i <= n; i++) 18 { 19 dis[i] = e[x][i]; 20 visit[i] = 0;// 21 if (e[x][i]<inf) 22 path[i] = x;//add new point into path 23 else 24 path[i] = -1;//this point doesn't inter the path 25 } 26 dis[x] = 0;//the dis from itself to isself is 0 27 visit[x] = 1;//has visited 28 for (int t = 0; t<n - 1; t++) 29 { 30 min = inf; 31 for (int i = 1; i <= n; i++) 32 { 33 if (!visit[i] && dis[i]<min)//has visited and short dis 34 { 35 k = i; 36 min = dis[i]; 37 } 38 } 39 visit[k] = 1;//k shortest point 40 for (int i = 1; i <= n; i++) 41 { 42 if (!visit[i] && dis[i]>dis[k] + e[k][i])//through k to this point is shorter 43 { 44 dis[i] = dis[k] + e[k][i]; 45 path[i] = k; 46 } 47 } 48 } 49 } 50 void printpath(int x) 51 { 52 if (x != -1) 53 { 54 printpath(path[x]); 55 cout<<v[x]<<" "; 56 } 57 } 58 int main() 59 { 60 int m, d; 61 char x, y; 62 while (1) 63 { 64 cin>>n>>m; 65 if (!n&&!m)break; 66 for (int i = 0; i<maxn; i++) 67 for (int j = 0; j<maxn; j++) 68 e[i][j] = inf; 69 for (int i = 1; i <= n; i++)//from 1 70 { 71 cin>>v[i]; 72 Hash[v[i]] = i;//build char index's hash list <char,int> 73 } 74 while (m--) 75 { 76 cin>>x>>y>>d; 77 e[Hash[x]][Hash[y]] = e[Hash[y]][Hash[x]] = d;//change to鄰接矩陣 78 } 79 cin >> x >> y; 80 Dijkstra(Hash[x]);//input start point.. 81 cout<<dis[Hash[y]]<<endl;//after renew,output dis... 82 printpath(path[Hash[y]]);//output path 83 cout<<v[Hash[y]]<<endl;//output last path 84 } 85 return 0; 86 }