1. 程式人生 > >程式設計師必須掌握的十種演算法---Dijkstra演算法

程式設計師必須掌握的十種演算法---Dijkstra演算法

由荷蘭電腦科學家艾茲赫爾·戴克斯特拉提出的使用了廣度優先搜尋解決非負權有向圖的單源最短路徑問題。

#include<stdio.h>
int main()
{
    /*
    *e儲存圖的矩陣表示
    *dis儲存1號頂點到其餘各個頂點的距離
    *book表示各個頂點是否已經找到最小距離
    */
    int e[10][10],dis[10],book[10],i,j,n,m,t1,t2,t3,u,v,min;

    int inf=99999999;//用inf(infinity)儲存一個我們認為的正無窮的值

    //讀入n,m,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; else e[i][j]=inf; } } //讀入邊 for(i=1;i<=n;i++) { scanf("%d %d %d",&t1,&t2,&t3); e[t1][t2]=t3; } //初始化dis陣列,這裡是1號頂點到其餘各個頂點的初始化路程
for(i=1;i<=n;i++) dis[i]=e[1][i]; //book陣列初始化 for(i=1;i<=n;i++) book[i]=0; book[1]=1; //Dijkstra演算法的核心語句 for(i=1;i<=n-1;i++) { //找到離1號頂點最近的頂點 min=inf; for(j=1;j<=n;j++) { if(book[j]==0&&dis[j]<min) { min=dis[j];//min儲存這個最小的距離
u=j;//u表示最近的頂點是哪個頂點 } } book[u]=1; for(v=1;v<=n;v++) { //檢視頂點u到頂點v是否連通 if(e[u][v]<inf) { if(dis[v]>dis[u]+e[u][v]) dis[v]=dis[u]+e[u][v]; } } } //輸出最終結果 for(i=1;i<=n;i++) { printf("%d ",dis[i]); } getchar(); return 0; }