Dijkstra算法解决的是单源最短路径问题:对于给定的有向网络G=(V,E)及单个源点v,求从v到G的其余各顶点的最短路径。
本文以下面的有向网络(用邻接矩阵存储)为例,并假设源点为1。
http://s11/middle/686d0fb0nb790d903ac4a&690
源程序如下:
#include<stdio.h>
#define maxsize 1000 //表示两点间不可达,距离为无穷远
#define n 7 //结点的数目
void dijkstra(int C[][n],int v);//求原点v到其余顶点的最短路径及其长度
void main()
{
printf("
——Dijkstra算法——\n");
int C[n][n]={
{maxsize,13,8,maxsize,30,maxsize,32},
{maxsize,maxsize,maxsize,maxsize,maxsize,9,7},
{maxsize,maxsize,maxsize,5,maxsize,maxsize,maxsize},
{maxsize,maxsize,maxsize,maxsize,6,maxsize,maxsize},
{maxsize,maxsize,maxsize,maxsize,maxsize,2,maxsize},
{maxsize,maxsize,maxsize,maxsize,maxsize,maxsize,17},
{maxsize,maxsize,maxsize,maxsize,maxsize,maxsize,maxsize}
},v=1,i,j;
printf("【打印有向图的邻接矩阵】\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("\t%d",C[i][j]);
}
printf("\n");
}
printf("【打印原点1到其他各点的最短路径及其长度】\n");
dijkstra(C,v);
}
void dijkstra(int C[][n],int v)//求原点v到其余顶点的最短路径及其长度
//C为有向网络的带权邻接矩阵
{
int D[n];
int P[n],S[n];
int i,j,k,v1,pre;
int min,max=maxsize,inf=1200;
v1=v-1;
for(i=0;i<n;i++)
{
D[i]=C[v1][i];
//置初始距离值
if(D[i]!=max)
P[i]=v;
else
P[i]=0;
}
for(i=0;i<n;i++)
S[i]=0;
//红点集S开始为空
S[v1]=1;D[v1]=0;
//开始点v送S
for(i=0;i<n-1;i++)
//扩充红点集
{
min=inf;//令inf>max,保证距离值为max的蓝点能扩充到S中
for(j=0;j<n;j++)//在当前蓝点中选距离值最小的点k+1
{
if((!S[j])&&(D[j]<min))
{
min=D[j];
k=j;
}
}
S[k]=1;
//将k+1加入红点集
for(j=0;j<n;j++)
{
if((!S[j])&&(D[j]>D[k]+C[k][j]))//调整各蓝点的距离值
{
D[j]=D[k]+C[k][j];
//修改蓝点j+1的距离
P[j]=k+1;
//k+1是j+1的前趋
}
}
} //所有顶点均已扩充到S中
for(i=0;i<n;i++)
{
printf("%d到%d的最短距离为",v,i+1);
printf("%d\n",D[i]);
//打印结果
pre=P[i];
printf("路径:%d",i+1);
while(pre!=0)
//继续找前趋顶点
{
printf("<——%d",pre);
pre=P[pre-1];
}
printf("\n");
}
} //dijkstra
运行结果:
http://s15/middle/686d0fb0nb790e43325be&690
加载中,请稍候......