最近在研究算法設計與分析,看到了單源最短路勁,特發文一篇。
下面代碼就是實現這個有向聯通圖
廢話不說直接上代碼
#include<stdio.h> #define m 5000 int c[5][5]= { m,10,m,30,100, m,m,50,m,m, m,m,m,m,10, m,m,20,m,60, m,m,m,m,m, }; int dist[5] ; void Dijkstra(int dist[]) { int prev[5]; int n=4; int v=0; int s[5],i,j,temp,u,newdist; for(i=0;i<=n;i++) { dist[i]=c[v][i]; s[i]=0; if(dist[i]==m)prev[i]=0; else prev[i]=v; } dist[v]=0; s[v]=1; //for(i=0;i<5;i++){printf("%d ",dist[i]);} //printf("\n"); for(i=0;i<=n;i++) { temp=m; u=v; for(j=1;j<=n;j++) if((!s[j])&&(dist[j]<temp)){u=j;temp=dist[j];}//找出一個與源點相連的最小的點 //printf("%d ",u); s[u]=1; for(j=1;j<=n;j++) if((!s[j])&&(c[u][j]<m)){ newdist=dist[u]+c[u][j]; if(newdist<dist[j]){dist[j]=newdist;prev[j]=u;} } } for(i=0;i<=n;i++) { printf("%d ",prev[i]+1); } printf("\n"); } void main() { int i; Dijkstra(dist); for(i=0;i<5;i++) printf("%d ",dist[i]); printf("\n"); getch(); }
程序運行結果如圖所示:
其中,第一行數據是當前節點的前一個節點。