#用c语言实现迪克斯特拉算法
求最短路已有成熟的算法,如迪克斯特拉算法,其思想就是从按距离从近到远,依次求得到各个顶点的最短距离。

  首先,构建结构体,其代码如下:
struct Dijkstra {int w[Maxsize][Maxsize];                     //权重距离矩阵int l[Maxsize];                              //依次求得各点到起点的最短距离int s;                                       //顶点个数
}path;

然后,我们将从键盘输入的距离矩阵整理,并输出:

void Dijkstra_mat()
{for (int i = 0; i < path.s; i++){for (int j = 0; j < path.s; j++){printf("%-6d", path.w[i][j]);}printf("\n");}printf("********************\n");
}

我们知道,迪克斯特算法的核心就是更新赋值矩阵,求得最短的路径,因此,我们需要更新最短路,其代码如下:

int min(int a, int b)                            //更新赋值路
{if (a <= b)return a;if (a > b)return b;
}

在c语言中,运用迪克斯特拉算法的核心部分,并以此调用以上函数,可得代码为:

void Dijkstra()
{int u = 0, v;          //u为起点,v为距u最短点for (int i = 0; i < path.s; i++){for (int v = 0; v < path.s; v++){path.l[v] = min(path.l[v], path.l[u] + path.w[u][v]);}u = the_mins(u);i++;}for (int j = 0; j < path.s; j++){printf("到第%d个地方的距离为%4d\n", j + 1, path.l[j]);}
}

主函数的作用为对距离矩阵赋值,并调用其他函数,最终得到完整的迪克斯特拉算法:

int main()
{int path_sum = 0;                                //最初的路径为0 printf("请输入顶点个数:");scanf_s("%d", &path.s);printf("请输入距离矩阵:");for (int i = 0; i < path.s; i++)                  //距离赋权矩阵赋值{for (int j = 0; j < path.s; j++){scanf_s("%d", &path.w[i][j]);if (path.w[i][j] == -1)path.w[i][j] = INF;printf("   ");}printf("\n");}for (int i = 0; i < path.s; i++){if (i == 0)path.l[i] = 0;elsepath.l[i] = INF;}printf("得到的距离矩阵为:\n");Dijkstra_mat();Dijkstra();
}

得到的完整代码:

#include<stdio.h>#define INF 9999
#define Maxsize 50struct Dijkstra {int w[Maxsize][Maxsize];                     //权重距离矩阵int l[Maxsize];                              //依次求得各点到起点的最短距离int s;                                       //顶点个数
}path;int min(int a, int b)                            //更新赋值路
{if (a <= b)return a;if (a > b)return b;
}void Dijkstra_mat()
{for (int i = 0; i < path.s; i++){for (int j = 0; j < path.s; j++){printf("%-6d", path.w[i][j]);}printf("\n");}printf("********************\n");
}
int the_mins(int u)                        //以距离上一个点最短的点为起点
{int v = u, j = 0;int min, step;for (int i = 0; i < path.s; i++){if (path.l[i] > path.l[u]){j++;if (j == 1){step = path.l[i];min = path.l[i];v = i;}if (path.l[i] < step){min = path.l[i];v = i;}}}return v;
}void Dijkstra()
{int u = 0, v;          //u为起点,v为距u最短点for (int i = 0; i < path.s; i++){for (int v = 0; v < path.s; v++){path.l[v] = min(path.l[v], path.l[u] + path.w[u][v]);}u = the_mins(u);i++;}for (int j = 0; j < path.s; j++){printf("到第%d个地方的距离为%4d\n", j + 1, path.l[j]);}
}int main()
{int path_sum = 0;                                //最初的路径为0 printf("请输入顶点个数:");scanf_s("%d", &path.s);printf("请输入距离矩阵:");for (int i = 0; i < path.s; i++)                  //距离赋权矩阵赋值{for (int j = 0; j < path.s; j++){scanf_s("%d", &path.w[i][j]);if (path.w[i][j] == -1)path.w[i][j] = INF;printf("   ");}printf("\n");}for (int i = 0; i < path.s; i++){if (i == 0)path.l[i] = 0;elsepath.l[i] = INF;}printf("得到的距离矩阵为:\n");Dijkstra_mat();Dijkstra();
}

例如,我们可运用以上代码求出下图的最短距离

调用该函数,我们得到

c语言实现迪克斯特拉算法相关推荐

  1. 07_第七章 迪克斯特拉算法

    本章内容: 继续图的讨论,介绍加权图--提高或降低某些边的权重 介绍迪克斯特拉算法,让你能够找出加权图中前往x的最短路径 介绍图中的环,迪克斯特拉算法只适用于有向无环图 在上一章中,我用广度优先算法可 ...

  2. 迪克斯特拉算法——算法图解

    引用算法图解中的原图: 代码如下: # 迪克斯特拉算法解决权重最短路径算法,不能解决负权重 graph = {} graph["start"] = {} graph["s ...

  3. 最短通路——迪克斯特拉算法

    迪克斯特拉算法初探--图解算法 迪克斯特拉算法的大致思想是这样:求出起始顶点到各个后继顶点的最短通路,直到所求顶点为止. 由于直接从抽象的代码分析比较复杂(笔者很菜  零零碎碎花了好几天才搞懂),我们 ...

  4. 加权图最短路径 - 迪克斯特拉算法

    问题 假设地图上4个点A.B.C.D,有连线表示可通行,并且是单向,连线上标有距离,如何求出A到C的最短路径 输入:{A: {B:1,D:3},B:{D:1,C:2},D:{C:1}} 输出:3 思路 ...

  5. 算法——迪克斯特拉算法

    迪克斯特拉算法主要分四个步骤: 找到"最便宜"的节点(可在最短时间内到达的节点). 更新该节点的邻居节点的开销. 重复这个过程,直到对图中每个节点都做了. 计算最终路径. 这个算法 ...

  6. 普里姆算法和迪克斯特拉算法

    迪克斯特拉算法         迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短 ...

  7. c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法

    迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本 ...

  8. 将A*算法讲明白的大牛 感谢原作者Frank_chen 基础是迪克斯特拉算法

    https://www.cnblogs.com/FrankChen831X/p/10358120.html https://www.cnblogs.com/csushl/p/10065069.html ...

  9. 广度优先搜索(BreadthFirstSearch) 迪克斯特拉算法 (Dijkstra's algorithm)

    BFS可回答两类问题: 1.从节点A出发,有前往节点B的路径吗? 2.从节点A出发,前往节点B的哪条路径经过的节点最少? BFS中会用到"队列"的概念.队列是一种先进先出(FIFO ...

最新文章

  1. JVM:对象的实例化、内存布局与访问定位
  2. 【Paper】31_[18]On a Dynamic Extension of the Theory of Graphs
  3. c++   string类
  4. why wechat is not a good place for the learning, but csdn is
  5. mfc打开控制台异常关闭_vc控制台程序关闭事件时的正确处理方式
  6. 从Mysql某一表中随机读取n条数据的SQL查询语句
  7. 2020计算机单招的大专,2020专科和单招的区别
  8. 2016012026 管凌波 散列函数的应用及其安全性
  9. js中追加写入文件(字符串追加)_note
  10. linux学习-使用DHCP动态管理主机地址
  11. 印象笔记Mac版的快捷键有哪些?Evernote for Mac快捷键大全
  12. 在RedHat Linux下安装惠普磁带机(转)
  13. Docker系列(8) Docker网络(3)-- 单机Docker网络配置
  14. QString 中文编码转换
  15. 将一颗树反转为其镜像
  16. 【css】巧用border制作三角形
  17. mysql数据库外连_数据库外连接及MySQL实现
  18. 反掩码、掩码和通配符的区别
  19. 开关稳压电源的晶体管
  20. 测试理论-测试用例设计 (一) --- 正交表分析法

热门文章

  1. nmap与zmap的使用
  2. STC15单片机-通过PWM调整灯亮度
  3. 用了都说好的Python专属无广告视频播放器,良心到想为它疯狂打call
  4. 如何理解深度学习中的局部最优
  5. 计算机应届博士生的一点求职经验——字节篇
  6. 2021年安全员-A证考试题库及安全员-A证新版试题
  7. LaTeX---行距设置
  8. word-解决复制相同的word内容,显示行间距差别大的原因
  9. DO、DTO、BO、AO、VO、POJO
  10. @WebFilter 的使用