迪克特斯拉最短路算法的C实现

本文提供了一个简洁的迪克斯特拉算法C语言实现,帮助学习者更好地理解和运用该算法。代码中详细注释了每一步操作,便于初学者跟进。通过输入图的节点数和边的权重,以及起始点和终点,程序会输出最短路径的权值和路径详情。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

许多同学在学习完离散数学迪克特斯拉算法后都想实现一下或是更深层次的了解,但是网上的许多大牛要么给的代码太简略要么太难,所以写了个比较简单的仅供参考,也可以对贪婪算法有一个更深的了解。

//迪克特斯拉算法的C实现
#include"stdio.h"
#define NUM 3    //结点的数目
int main(){
    int _short[NUM];
 int least;
 int i,j,k;
 int array[NUM][NUM];
 int start,end;
    void way(int k,int start,int array[][NUM],int * _short);
 for(i=0;i<NUM;i++)
  _short[i]=100;
    printf("初始化图\n");
 for(i=0;i<NUM;i++)
  for(j=0;j<NUM;j++)
   scanf("%d",&array[i][j]);
    printf("输入头和尾\n");
    scanf("%d%d",&start,&end);
 _short[start]=0;
 while(start!=end){
     least=99;
     for(k=0;k<NUM;k++){
   if(_short[k]!=100){
    for(i=0;i<NUM;i++){
        if(_short[i]==100)
     {least=least<_short[k]+array[k][i]?least:_short[k]+array[k][i];}
    }
   }
  }
 
 for(k=0;k<NUM;k++){
  if(_short[k]!=100){
   for(i=0;i<NUM;i++){
    if((array[k][i]+_short[k]==least)&&(_short[i]==100)){
        _short[i]=least;
     if(i==end){
      printf("两点最短权为最短权为:\n");
         printf("%d\n",_short[i]);
      printf("其路径为(反序结果):\n");
      printf("%d %d ",i,k);
      way(k,start,array, _short);
         break;
     }
    }
   }
  }
 }
 }
 printf("0");
 return 0;
}
void way(int k,int start,int array[][NUM],int * _short){
 int a;
    while(k!=start){
  for(a=0;a<NUM;a++){
   if(a!=k){
       if(array[k][a]+_short[a]==_short[k]){
           printf("%d ",a);
        k=a;
    }
   }
  }
 }
 printf("\b\b%d",start);
}


如有错误,欢迎指正。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值