最短路徑(一)——多源最短路徑
阿新 • • 發佈:2019-01-23
引出問題:多源最短路徑的問題
暑假,小文準備去一些城市旅遊。為了節省經費以及方便計劃旅程,小文希望知道任意兩個城市之間的最短路徑。假如有四個城市八條公路。
我們這時怎麼做?
首先用一個數據結構來儲存圖的資訊,因為是四個城市就可以選擇4*4的矩陣:
距離 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
1 | 0 | 2 | 6 | 4 |
2 | ∞ | 0 | 3 | ∞ |
3 | 7 | ∞ | 0 | 1 |
4 | 5 | ∞ | 12 | 0 |
這時我們怎麼做呢?
首先想到了兩個指定點的最短路徑問題,所以進行n2遍深度或者廣度優先搜尋,既可以得到最終結果,但別的方法呢?
假設現在只允許經過1號頂點,求任意兩點間的最短距離。程式如下:
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if (e[i][j] > e[i][1] + e[1][j])
e[i][j] = e[i][1] + e[1][j]
}
}
這其實是一種“動態規劃”的思想,從i頂點到j號頂點只經過前K號點的最短路程,下面給出演算法的完整程式碼:
#include <stdio.h>
int main()
{
int e[10][10],k,i,j,n,m,t1,t2,t3
int inf=99999;
//n表示頂點個數,m表示邊的條數
scanf("%d %d",&n,&m)
//初始化
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i=j) e[i][j]=0 //e[i][j]表示的是從i頂點到j頂點之間的路程
else e[i][j]=inf;
//讀入邊
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&t1,&t2,&t3);
e[t1][t2]=t3;
}
//演算法核心語句
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j] = e[i][k]+e[k][j];
//輸出最終結果
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%10d",e[i][j]);
}
printf("\n");
}
return 0;
}
通過這種演算法可以求出任意兩點之間的最短路徑,時間複雜度為O(N3)