码迷,mamicode.com
首页 > 编程语言 > 详细

迪杰特斯拉夫最短路径算法

时间:2016-05-11 21:52:19      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

#include<stdio.h>
#include<windows.h>

int a[10][10];
int arc[10];//记录弧的端点
int cost[10];//记录从起始点到当前i点的距离
int use[10];//记录当前i点是否被使用

void path(int n){

   for(int i=0;i<n;i++){//初始赋值默认所有点从点0开始,该点的路径前缀点为0,use[i]未被使用
      cost[i]=a[0][i];
      arc[i]=0;
      use[i]=0;
   }
   use[0]=1;//默认0为起点,将0加入最短路径
   for(int i=1;i<n;i++){//默认最后的路径必为连通图
      int j=1;          //记录当前循环下标
      int k=0;          //记录目前已知的未知点路径最短的点下标
      int min=65535;    //比较值默认65535为不可达
      while(j<n){
          if(use[j]==0&&cost[j]>0&&cost[j]<min){//判断条件:当前点未用且路径比目前最短的路径端
              k=j;
              min=cost[i];
          }
          j++;
      }
      use[k]=1;//标记该点到起点的路径已知
      printf("%d,%d\n",k,cost[k]);
      for(int i=0;i<n;i++){
           printf("%d ",cost[i]);
      }
      printf("\n");
      system("pause");
      for(int t=0;t<n;t++){
          //更新由已知新的算出来最短路径的点到剩余的点的路径的长度,条件:可达且未被用,更新后的值比当前的值小
          if(a[k][t]>0&&a[k][t]<65535&&use[t]==0&&a[k][t]+cost[k]<cost[t]){
            cost[t]=a[k][t]+cost[k];
            arc[t]=k;
          }
      }
   }
   for(int i=0;i<n;i++){
       printf("%d ",arc[i]);
   }
}
int main(){
   int n;
   scanf("%d",&n);
   for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
         scanf("%d",&a[i][j]);
      }
   }
   path(n);

}

 

迪杰特斯拉夫最短路径算法

标签:

原文地址:http://www.cnblogs.com/lhppom/p/5483597.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!