图的顶点从0到7编号,边的权值也已经标记,目标是运用Dantjig算法求出图中所有点到点0的最短距离。图如下:
程序运行结果正常,截图如下:
以下为完整的源码及注释:
#include
main()
{
int i,j,bflag,temp,min,r;
int g[8][8]={ //初始化图的邻接矩阵
{1,2,8,1,0,0,0,0}, //g[i][i]=1表示点i属于集合A
{2,0,6,0,1,0,0,0}, //g[i][i]=0表示点i不属于集合A
{8,6,0,7,4,2,2,0}, //初始化时将点0放入集合A,其余点不在集合A中
{1,0,7,0,0,0,9,0},
{0,1,4,0,0,3,0,9},
{0,0,2,0,3,0,4,6},
{0,0,2,9,0,4,0,2},
{0,0,0,0,9,6,2,0}
};
int t[8]={0}; //用于存放任意一点到初始点0的最短距离
printf("Graph initialization:/n");
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
printf("%d,",g[i][j]);
}
printf("/n");
}
printf("/nResults:/n");
while(1){ //循环内完成Dantjig算法
bflag = 1;
for(i=0;i<8;i++)
bflag = g[i][i] && bflag; //所有点均在集合A中为算法退出条件
if (bflag == 1)
break;
min = 100; //min用于保存已找到的点i到点0的最短距离
r=0; //r用于保存点的标号
for(i=0;i<8;i++)
{
if(g[i][i] == 1){ //寻找集合A中的点
for(j=0;j<8;j++) //寻找集合A以外且符合算法条件的点加入集合A
{
if((g[j][j]==0) && (g[i][j]!=0)){
temp = t[i]+g[i][j];
if(temp
{
min = temp;
r = j;
}
}
}
}
}
g[r][r] = 1; //找到集合A以外的点并将其加入集合A
t[r] = min; //保存新加入集合A的点到点0的最短距离
printf("The shortest distence from 0 to %d is:%d/n", r, t[r]);
}
}