最近在研究算法设计与分析,看到了单源最短路劲,特发文一篇。

下面代码就是实现这个有向联通图
废话不说直接上代码
#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();
}
程序运行结果如图所示:

其中,第一行数据是当前节点的前一个节点。
浙公网安备 33010602011771号