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


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

發布時間: 2018年11月26日 10:14   時間限制: 1000ms   內存限制: 128M

有趣的最短路...火候欠佳,目前還很難快速盲打出來,需繼續練習。

一張地圖包括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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM