日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二十五、求单点的最短路径

發布時間:2025/3/21 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二十五、求单点的最短路径 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

二十五、求單點的最短路徑

文章目錄

  • 二十五、求單點的最短路徑
    • 題目描述
    • 解題思路
    • 上機代碼

題目描述

求從指定源點出發到各個頂點的最短路徑。

**假設:**圖中結點名均為單個互不相同的字母,權值均>0。

輸入:
第一行:結點數量n,弧數量e,源點
后續e行:<結點,結點,權值>

輸出:
按結點的升序輸出到達各個結點的最短路徑長度

測試輸入期待的輸出時間限制內存限制額外進程
測試用例 17,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秒64M0
測試用例 25,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秒64M0
測試用例 35,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秒64M0

解題思路

在之前參加集訓時,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; }

總結

以上是生活随笔為你收集整理的二十五、求单点的最短路径的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。