二十五、求单点的最短路径
生活随笔
收集整理的這篇文章主要介紹了
二十五、求单点的最短路径
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
二十五、求單點的最短路徑
文章目錄
- 二十五、求單點的最短路徑
- 題目描述
- 解題思路
- 上機代碼
題目描述
求從指定源點出發到各個頂點的最短路徑。
**假設:**圖中結點名均為單個互不相同的字母,權值均>0。
輸入:
第一行:結點數量n,弧數量e,源點
后續e行:<結點,結點,權值>
輸出:
按結點的升序輸出到達各個結點的最短路徑長度
| 測試用例 1 | 7,10,a <a,b,13> <a,c,8> <c,d,5> <d,e,6> <a,e,30> <a,g,32> <b,g,7> <b,f,9> <e,f,2> <f,g,17> | a:0 b:13 c:8 d:13 e:19 f:21 g:20 | 1秒 | 64M | 0 |
| 測試用例 2 | 5,9,a <a,b,10> <b,a,20> <a,d,50> <a,e,45> <b,c,15> <c,d,20> <c,e,5> <d,e,10> <e,c,30> | a:0 b:10 c:25 d:45 e:30 | 1秒 | 64M | 0 |
| 測試用例 3 | 5,7,a <a,b,10> <b,c,50> <a,d,30> <a,e,100> <c,e,10> <d,c,20> <d,e,60> | a:0 b:10 c:50 d:30 e:60 | 1秒 | 64M | 0 |
解題思路
在之前參加集訓時,ACM集訓隊的同學向我們講了四種計算最短路的算法:Floyd、Dijkstra、Bellman-Ford、SPFA。
其中,Floyd適合計算多源最短路,Dijkstra、Bellman-Ford、SPFA適合單源最短路。Dijkstra不能處理權值為負的情況,而 Bellman-Ford 可以處理負權值,SPFA是對 Bellman-Ford 的計算優化。
本題很明顯可以看出是很經典的單源最短路問題,且權值均大于0,可以采用常用的 Dijkstra 算法來計算。
輸入序列中的結點名并不是數字而是字母,因為我們做一個簡單的減法,將結點名轉換為數字,集訓時已經做過很多這樣的題了,直接套用之前總結好的板子就可以了。
上機代碼
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; const int inf = 0x3f3f3f; int road[1010][1010], d[1010]; bool vis[1010]; int n, m, num = 0;void dijkstra(int s)//dijkstra算法 {for (int i = 0; i < n; i++){d[i] = road[s][i];vis[i] = false;}d[s] = 0;vis[s] = true;for (int i = 0; i < n; i++){int temp = inf, v;for (int j = 0; j < n; j++){if (!vis[j] && temp > d[j]){temp = d[j];v = j;}}if (temp == inf)break;vis[v] = true;for (int j = 0; j < n; j++){if (!vis[j] && d[v] + road[v][j] < d[j]){d[j] = d[v] + road[v][j];}}} } int main() {int x, y, dis;char a, b, c;scanf("%d,%d,%c", &m, &n, &c);getchar(); //讀取換行符for (int i = 0; i < n; i++)//初始化{for (int j = 0; j < n; j++){road[i][j] = (i == j) ? 0 : inf;}}for (int i = 0; i < n; i++){scanf("<%c,%c,%d>", &a, &b, &dis);getchar();x = a - 'a';//把字符轉化為數字來算y = b - 'a';if(road[x][y]>dis)road[x][y]= dis;}num = c - 'a';dijkstra(num);for (int i = 0; i < m; i++){printf("%c:%d\n", i + 'a', d[i]);//記得轉回字符}//system("pause");return 0; }總結
以上是生活随笔為你收集整理的二十五、求单点的最短路径的全部內容,希望文章能夠幫你解決所遇到的問題。