数据结构-迪杰斯特拉,佛洛依德(两顶点之间可到达的最短距离)
说来很惭愧,有个兄弟找我做了一道图的生成树题目我把题目给看错了,给看作求最小两点之间的可到达最短距离,本来题目意思是求任意两个村庄之间可以互通的最小资金花费,,,,我都不知道怎么看成了两点之间的最短路径,在此跟那个兄弟说声抱歉(如果那个兄弟能看到的话),好了进入我们今天的主题吧,这两个算法写了差不多40分钟,因为之前学数据结构的时候大家都懂吧,光听反正写代码是不可能的,所以导致我写的时候记忆力很是模糊,查资料了一番大体了解了一下,然后自己进行了摸索写出来了,网上的讲解很多,并且大部分都很好理解,所以大家可以直接来看我的代码
1.迪杰斯特拉
简单介绍一下吧,贪心算法的使用,就是每次循环贪心一次,然后循环边的总数之后就可以得出最后的总结果
重点:我这里面使用的是线性表,也就是直接用的数组存储,然后对应的是有权的无向图,当然了有向图的话改Graoh的建立就可以。
#include<stdio.h>
#include<string.h>
#define MAX 1e5 //定义一个无穷大
#define max_value 15 //定义输入边边权值的最大容量
#define max_side 20 //定义最大边数
int Side_a[max_value],Side_b[max_value],value[max_value]; //分别代表输入的第一个边,第二个边,和两边的权值
int Graph[max_side][max_side]; //表示整个图之间边的关系,如果为MAX则表示不能直接到达
int flag[max_side]; //标记每一个边是否已经走过了
void Init()
{memset(Side_a,0,sizeof(Side_a));memset(Side_b,0,sizeof(Side_b));memset(value,0,sizeof(value));memset(flag,0,sizeof(flag));for(int i=0;i<max_side;i++){for(int j=0;j<max_side;j++){if(i==j){Graph[i][j]=0;continue; } Graph[i][j]=MAX;}}
}
int fmin(int x,int y)
{return x>y?y:x;
}
void Dijkstra(int SIDE,int v0)
{int i,j,k;int side_value; //权值迭代器int side=0; //边的标志器 for(i=1;i<=SIDE;i++) //总共SIDE个顶点,每一次循环走一个节点,所以SIDE次循环就可以走完所有节点 {side_value=MAX; for(j=1;j<=SIDE;j++){if(v0!=j&&flag[j]==0&&Graph[v0][j]!=MAX){if(side_value>Graph[v0][j]){side_value=Graph[v0][j];side=j;}} }flag[side]=1; //将该点进行标记 for(k=1;k<=SIDE;k++){if(!flag[k]){Graph[v0][k]=fmin(Graph[side][k]+side_value,Graph[v0][k]);}}}
}
void print(int n,int SIDE)
{printf("%d点距离其他顶点的最短路径",n);for(int i=1;i<=SIDE;i++){printf("%d ",Graph[n][i]);}printf("\n");
}
int main()
{Init();int n,SIDE;printf("请输入总顶点数:");scanf("%d",&SIDE);printf("请输入你需要输入的已知条件数(小于%d):",max_value);scanf("%d",&n);printf("请按照边1,边2,权值进行输入,边值<=%d,权值<%d:\n",fmin(SIDE,max_side),MAX);for(int k=1;k<=n;k++){scanf("%d%d%d",&Side_a[k],&Side_b[k],&value[k]);}for(int i=1;i<=n;i++) //无向有权图,为对称矩阵 {Graph[Side_a[i]][Side_b[i]]=value[i];Graph[Side_b[i]][Side_a[i]]=value[i];}Dijkstra(SIDE,1);print(1,SIDE);return 0;
}
当然了给大家附上输出的结果以我画的这个图为例子:
所以输入如下:
2.佛洛依德算法:
直接用三个for循环来计算所有顶点之间的距离,当然了也就不需要flag当标记了核心代码也简洁了很多,相当于对于迪杰斯特拉外侧套了一个for循环是一样的。时间复杂度为o(n3)
#include<stdio.h>
#include<string.h>
#define MAX 1e5 //定义一个无穷大
#define max_value 15 //定义输入边边权值的最大容量
#define max_side 20 //定义最大边数
int Side_a[max_value],Side_b[max_value],value[max_value]; //分别代表输入的第一个边,第二个边,和两边的权值
int Graph[max_side][max_side]; //表示整个图之间边的关系,如果为MAX则表示不能直接到达
void Init()
{memset(Side_a,0,sizeof(Side_a));memset(Side_b,0,sizeof(Side_b));memset(value,0,sizeof(value));for(int i=0;i<max_side;i++){for(int j=0;j<max_side;j++){if(i==j){Graph[i][j]=0;continue; } Graph[i][j]=MAX;}}
}
int fmin(int x,int y)
{return x>y?y:x;
}
void Kruskal(int SIDE)
{for(int i=1;i<=SIDE;i++){for(int j=1;j<=SIDE;j++){for(int k=1;k<=SIDE;k++){Graph[i][j]=fmin(Graph[i][j],Graph[i][k]+Graph[k][j]); //直接比较即可,因为我们设置了最大数的判断 }}}
}
void print(int SIDE)
{for(int i=1;i<=SIDE;i++){for(int j=1;j<=SIDE;j++){printf("%d ",Graph[i][j]);}printf("\n");}
}
int main()
{Init();int n,SIDE;printf("请输入总顶点数:");scanf("%d",&SIDE);printf("请输入你需要输入的已知条件数(小于%d):",max_value);scanf("%d",&n);printf("请按照边1,边2,权值进行输入,边值<=%d,权值<%d:\n",fmin(SIDE,max_side),MAX);for(int k=1;k<=n;k++){scanf("%d%d%d",&Side_a[k],&Side_b[k],&value[k]);}for(int i=1;i<=n;i++) //无向有权图,为对称矩阵 {Graph[Side_a[i]][Side_b[i]]=value[i];Graph[Side_b[i]][Side_a[i]]=value[i];}Kruskal(SIDE);print(SIDE);return 0;
}
还是上面的输入方法:
数据结构-迪杰斯特拉,佛洛依德(两顶点之间可到达的最短距离)相关推荐
- 数据结构——迪杰斯特拉(Dijkstra)算法
迪杰斯特拉算法又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题.迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点 ...
- 大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)
6 最短路径 最短路径,对于图来说,是两顶点之间经过的边数最少的路径:对于网来说,是指两顶点之间经过的边上权值之和最小的路径.路径上第一个顶点为源点,最后一个顶点是终点. 6.1 迪杰斯特拉(Di ...
- [ 数据结构 ] 迪杰斯特拉算法(最短路径问题)
0 最短路径问题 战争时期,胜利乡有 7 个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从 G 点出发,需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄 各个 ...
- 迪杰斯特拉(Dijkstra)算法之两点之间的最短距离问题
1.概述 (1)与弗洛伊德(Floyd)算法一样,迪杰斯特拉(Dijkstra)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,主要特点是以出发点为中心向外层层扩展(广度优先搜索思想),直到扩 ...
- 校园导游图(数据结构 迪杰斯特拉 prime)
校园导游图 1.1功能需求: 1)为来访客人提供图中任意景点相关信息的查询. 2)为来访客人提供图中任意2个景点的问路查询,即查询任意两个景点之间的一条最短的简单路径. 3)以尽可能低的造价建造景点间 ...
- Dijkstra(迪杰斯特拉)算法:求给定顶点到其余各顶点的最短路径
算法特点:该算法使用广度优先搜索解决了赋权有向图或者无向图的单源点最短路径问题.(求给定顶点到其余各点的最短路径问题) 算法思路:Dijkstra算法采用的是一种贪心的策略,声明一个数组dis来保存源 ...
- 【数据结构与算法】迪杰斯特拉算法的介绍和最短路径问题程序实现
目录 1. 迪杰斯特拉算法的介绍 2. 迪杰斯特拉算法的原理 3. 最短路径问题介绍 1. 迪杰斯特拉算法的介绍 迪杰斯特拉(Dijkstra)算法是典型求两点之间最短路径算法.它的主要特点是以起始点 ...
- java数据结构和算法——迪杰斯特拉(Dijkstra)算法
目录 一.迪杰斯特拉(Dijkstra)算法介绍 二.迪杰斯特拉(Dijkstra)算法过程 三.迪杰斯特拉(Dijkstra)算法--应用场景(最短路径问题) 四.迪杰斯特拉(Dijkstra)算法 ...
- 图 相关算法~从头学算法【广搜、 深搜、 拓扑排序、 并查集、 弗洛伊德算法、迪杰斯特拉算法】
图的相关主流算法主要有: 广度优先搜索 深度优先搜索 拓扑排序 并查集 多源最短路径(弗洛伊德算法) 单源最短路径(迪杰斯特拉算法) 其中呢,最基本的是前两种,也就是平时常用的广搜和深搜,本文中将概要 ...
最新文章
- MyBatis框架学习 DAY_02:使用XML配置文件/多参数问题 / FOREACH /IF / #{}和${} / 创建SSM框架流程
- php单屏网站源码,关于原生js实现类似fullpage的单页/全屏滚动的方法
- GWT更改元素样式属性
- VTK修炼之道15:图像处理_显示(vtkImageViewer2 vtkImageActor)
- 设计模式之_Iterator_02
- Tomcat启动时加载本地证书出错的问题
- 我为什么fuck GFW同时FUCK 开心网
- VSTO学习笔记(四)从SharePoint 2010中下载文件
- Intel 64/x86_64/IA-32/x86处理器通用寄存器 (1) - 32位通用寄存器
- python django 动态网页_Django-手撸简易web框架-实现动态网页-wsgiref初识-jinja2初识-python主流web框架对比-00...
- 汉诺塔的java实现及一种思路
- 关于hibernate注解方法中一对多的级联更新
- java项目新东方在线源码_[VIP源码]【S019】SSM框架开发智夫子在线考试系统项目源码 百度云盘...
- linux关掉终端快捷键,linux终端快捷键汇总
- 数据库 关于权限管理系统的三种设计方法
- Redis写副本内存不够
- 海龟python词树_python海龟画树
- java正则提取字符串中的符号汉字数字字母
- 四轮 控制算法 麦轮_AGV-麦克纳姆轮小车控制总结
- 参数调优:K折交叉验证与GridSearch网格搜索