最近在研究算法设计与分析,看到了单源最短路劲,特发文一篇。
下面代码就是实现这个有向联通图
废话不说直接上代码
#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(); }
程序运行结果如图所示:
其中,第一行数据是当前节点的前一个节点。