Dantjig算法求最短路径的c语言实现

图的顶点从07编号,边的权值也已经标记,目标是运用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]);

}

}

 

 

 

你可能感兴趣的:(c/c++,算法,语言,c,initialization,graph)