1. 程式人生 > >最短路徑(一)——多源最短路徑

最短路徑(一)——多源最短路徑

引出問題:多源最短路徑的問題

暑假,小文準備去一些城市旅遊。為了節省經費以及方便計劃旅程,小文希望知道任意兩個城市之間的最短路徑。假如有四個城市八條公路。

我們這時怎麼做?

首先用一個數據結構來儲存圖的資訊,因為是四個城市就可以選擇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)