最短路径(C语言实现)

C语言实现最短路径

题目在https://blog.csdn.net/qq_42453280/article/details/105976017这个链接上

算法是使用https://www.bilibili.com/video/BV1b7411N798?p=63&vd_source=8ef55476b38a417a7a8056caa65608f2上的王道数据结构P63 Dijkstra最短路径算法思路,将它代码化,下面是源代码

#include <stdio.h>
#include <stdbool.h>
#define INT 30000
//#define SIZE 7
//
//void table_init(int *p_table, int width);
//void table_show(int *p_table, int width);
int min(int *dist,int *final,int num);

int main() {
    int dist[7];//存放从起始点到终点的距离
    int path[7];//存放起始点到终点的上一个节点
    int final[7];//存放是否已经找到了终点
    int start = 0;//who
    int end;
    printf("end:");
    scanf("%d",&end);
    printf("\n");
    int table[7][7]={{INT,4,6,6,INT,INT,INT},
                     {INT,INT,1,INT,7,INT,INT},
                     {INT,INT,INT,INT,6,4,INT},
                     {INT,INT,2,INT,INT,5,INT},
                     {INT,INT,INT,INT,INT,INT,6},
                     {INT,INT,INT,INT,1,INT,8},
                     {INT,INT,INT,INT,INT,INT,INT}};
    for(int i=0;i<7;i++){
        dist[i] = table[start][i];
        path[i] = (table[start][i]==INT)?-1:start;
        final[i] = false;
    }
    dist[start] = 0;
    final[start] = true;
    path[start] = -1;
    for(int i=0;i<7;i++) {
        printf("%d\t%d\t%d\n",dist[i],final[i],path[i]);
    }
    for(int i=1;i<7;i++){
        int To_final = min((int *)(&dist),(int *)(&final),7);
        printf("To_final = %d\n",To_final);
        final[To_final] = true;
        for(int j=0;j<7;j++){
            if(final[j]==false && (dist[To_final]+table[To_final][j] < dist [j])) {
                dist[j] = dist[To_final] + table[To_final][j];
                path[j] = To_final;
            }
        }
    }
    for(int i=0;i<7;i++) {
        printf("%d\t%d\t%d\n",dist[i],final[i],path[i]);
    }

    printf("[%d]",end);
    while(path[end] != -1){
        printf("<-[%d]",path[end]);
        end = path[end];
    }
    return 0;
}


int min(int *dist,int *final,int num){
    int index;
    int min = 2*INT;
    int cnt=0;
//    printf("%d\n",dist[2]);
    do{
        if(dist[cnt]<min && final[cnt] == false) {
            min = dist[cnt];
//            printf("min = %d\n",min);
            index = cnt;
//            printf("index = %d\n",index);
        }
        cnt++;
    }while(cnt<num);
//    printf("%d\n",index);
    return index;
}
//
//void table_init(int *p_table, int width) {
//    for (int i = 0; i < width; i++) {
//        for (int j = 0; j < width; j++) {
//            p_table[i * width + j] = INT;
//        }
//    }
//}
//
//void table_show(int *p_table, int width) {
//    for (int i = 0; i < width; i++) {
//        for (int j = 0; j < width; j++) {
//            printf("%d\t", p_table[i * width + j]);
//        }
//        printf("\n");
//    }
//}

附上结果

思路是这个B站视频的思路,但是我的代码实现并不是那么灵活,草草写出来了,相信肯定有更加好的实现方法,仅供参考

改进方向:可以从任何点出发,任何点结束。

注:如有侵权问题,邮箱:1093666482@qq.com

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值