#include <stdio.h>
int main()
{
int i,j,bflag,temp,min,r;
int {1,4,1,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
{3,2,0,6,4,2,2,0}, //初始化时将点0放入集合A,其余点不在集合A中
{1,0,7,5,0,0,3,0},
{0,1,4,0,0,3,0,9},
{0,0,2,0,3,0,4,6},
{0,0,2,9,0,4,0,1},
{0,0,0,0,4,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)
{
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]);
}
return 0;
}
最短路径的实现
最新推荐文章于 2023-03-12 21:20:07 发布