最短路径 (C语言版)

最短路径算法

#include<stdio.h>

#define N 11

#define M 1000000

struct node

{

       int num; //本来序号

       int lin; //临时性标记

};

 

void main()

{

       int i,j,t,k,m,test;

       node l[N+1];

       int w[N+1][N+1]={0};

       int cnt=0;//统计节点数

       int c[N+1]={0}; //存放节点

 

w[1][2]=676;

w[1][3]=1813;

w[2][4]=842;

w[2][5]=511;

w[3][5]=695;

w[3][6]=811;

w[4][7]=110;

w[4][8]=967;

w[5][9]=943;

w[6][10]=1376;

w[7][8]=639;

w[8][9]=902;

w[8][11]=607;

w[9][10]=367;

w[9][11]=672;

 

for(i=1;i<N+1;i++)

   for(j=1;j<N+1;j++)

    if(w[i][j] ==0)

            w[i][j]=M;

 

       for(i=1;i<N+1;i++)

      l[i].num=i;

           l[1].lin=0;

         

          for(i=2;i<N+1;i++)

                 l[i].lin=M;

 

          for(i=2;i<N+1;i++)

                 l[i].lin=w[1][i];

 

 

          for(i=2;i<N+1;i++)

          {

                 for(j=i;j<N+1;j++)

                 {

                        t=l[i-1].lin+w[i-1][j];

                        if(t<l[j].lin)

                               l[j].lin=t;

                 }

                    

                 for(k=1;k<N+1;k++)

                     printf("%d ",l[k].lin);

                     printf("\n");

             

                

                    test= l[i].lin;

                       m=i;

                       for(k=m;k<N+1;k++)

                       {

                              if(test>l[k].lin)

                              {

                                     test=l[k].lin;

                                     m=k;

                              }

                       }

 

                     if(m !=i)

                     {

                            node temp = l[i];

                            l[i]=l[m];

                            l[m]=temp;

                     }

                

             

          }

      

                  for(k=1;k<N+1;k++)

                               for(m=k+1;m<N+1;m++)

                                      if(l[k].num>l[m].num)

                                      {

                                             node temp=l[k];

                                             l[k]=l[m];

                                             l[m]=temp;

                                      }

   

 

              i=N;

              j=N-1;

 

       while(j>0)

       {

              if(l[i].lin == l[j].lin+w[j][i])

              {

                     i=j;

                     c[cnt]=j;

                     cnt++;

                     j--;

              }

              else

              j--;

       }

 

       printf("最短路径如下:\n");

       for(i=cnt-1;i>=0;i--)

       {

       printf("p-->[%d]\n",c[i]);

       }

 

              printf("p-->[%d]\n",N);

             

                       

}

posted @ 2013-06-20 12:00  zhgs_cq  阅读(1450)  评论(0编辑  收藏  举报