[C] [最短路] 只有5行的算法:Floyd-Warshall
生活随笔
收集整理的這篇文章主要介紹了
[C] [最短路] 只有5行的算法:Floyd-Warshall
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
終于學到求最短路了,終于來到我最喜歡的算法——Floyd-Warshall了!今天還有點小激動呢!
我喜歡它,當然是因為它邏輯十分簡單咯!真的只有5行誒!
Floyd-Warshall算法
題目描述
暑假,小哼準備去一些城市旅游。有些城市之間有公路,有些城市之間則沒有,如下圖。為了節省經費以及方便計劃旅程,小哼希望在出發之前知道任意兩個城市之前的最短路程。
核心思想
對于一個用鄰接矩陣存好的圖,對于每一個點,將它作為轉車點,然后再對每個點進行遍歷,如果距離小于轉機(直走還不如轉車的情況下)就更新這段“直走”的值。
核心代碼:
//快樂的Floyd-Warshall核心語句for (k = 1; k <= n; k++) //k是被中轉的點for (i = 1; i <= n; i++)for (j = 1; j <= n; j++)if (a[i][j] > a[i][k] + a[k][j])a[i][j] = a[i][k] + a[k][j];
完整代碼:
#include<stdio.h>
int a[2000][2000];
int inf = 99999999;
int main()
{int i, j, k, m, n, x, y, s;scanf("%d %d", &n, &m);/* *///初始化for (i = 1; i <= n; i++)for (j = 1; j <= n; j++)if (i == j)a[i][j] = 0;elsea[i][j] = inf;//讀入邊(有向圖)for (i = 1; i <= m; i++){scanf("%d %d %d", &x, &y, &s);a[x][y] = s;}printf("原地圖:\n");for (i = 1; i <= n; i++){for (j = 1; j <= n; j++){printf("%9d ", a[i][j]);}printf("\n");}//快樂的Floyd-Warshall核心語句for (k = 1; k <= n; k++) //k是被中轉的點for (i = 1; i <= n; i++)for (j = 1; j <= n; j++)if (a[i][j] > a[i][k] + a[k][j])a[i][j] = a[i][k] + a[k][j];printf("Floyd-Warshall邊松弛結果:\n");for (i = 1; i <= n; i++){for (j = 1; j <= n; j++){printf("%9d ", a[i][j]);}printf("\n");}return 0;
}
運行結果:
總結
以上是生活随笔為你收集整理的[C] [最短路] 只有5行的算法:Floyd-Warshall的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求以法开头的成语接龙!
- 下一篇: 传单多少钱啊?