最短路径之Floyd(弗洛伊德)算法,以及显示完整路径
简介:
Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。
我的上一篇文章讲的dijjstra算法,是图中某一个顶点,到其它顶点之间的最短路径.时间复杂度为O(n2),是单源最短路径
而Floyd算法,是图中每一个顶点,到其它顶点之间的最短路径.时间复杂度为O(n3).也被称为多源最短路径问题.
算法思想:
1,逐个顶点试探
2,从Vi到Vj的所有可能存在的路径中
3,选出一条长度最短的路径
求最短路径步骤:
初始时设置一个n阶方阵,令其对角线元素为0,若存在弧<Vi,Vj>,则对应元素为权值;否则为∞
逐步试着在原直接路径中增加中间顶点,若加入中间顶点后路径变短,则修改之;否则,维持原值.所有顶点试探完毕,算法结束
举个实例:
1,加入顶点a:
2,加入顶点b:
3,加入顶点c:
4,加入顶点d:
5,加入顶点e:
这个就是具体的一个过程,下面是实现代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
#define MAXINT 10000
int get_index(char* arr, char ch)//得到输入的字符在数组中的下标
{int i = 0;for(i = 0; i < MAXINT;i++){if(arr[i] == ch)return i;}return -1;
}
void FindPath(int MiddleVer[MAXSIZE][MAXSIZE],int start, int end, char vertex[MAXSIZE])//寻找经过的结点
{if(MiddleVer[start][end] == MAXINT)//说明start和end,两个顶点是直连的,中间没有别的顶点了{printf("%c",vertex[start]);}else{ //如果tart和end,两个顶点之间还有别的顶点FindPath(MiddleVer, start, MiddleVer[start][end], vertex);//则递归查找,从start位置到中间点位置的路径start = MiddleVer[start][end];while(MiddleVer[start][end] != MAXINT)//再查找从中间点位置到end位置之间的路径.{//这里为什么不也用递归?是因为顺序的问题.这里如果也用递归,找出来的顶点顺序相反了.printf("%c",vertex[MiddleVer[start][end]]);start = MiddleVer[start][end];}}printf("%c",vertex[end]);
}void floyd()
{int m,n,i,j,k;char ch1,ch2;char vertex[MAXSIZE];//顶点数组int arcs[MAXSIZE][MAXSIZE];//图的邻接矩阵,存储每一条边的权值int MiddleVer[MAXSIZE][MAXSIZE];//存储每条边之间的中间点的下标,如果没有中间点,则值为MAXINTfor(i = 0;i < MAXSIZE;i++){for(j = 0;j < MAXSIZE;j++){if(i == j)arcs[i][j] = 0;else arcs[i][j] = MAXINT;//初始化每一条边MiddleVer[i][j] = MAXINT;//初始化每一条边的中间点}}printf("请输入顶点数和弧的数目:>");scanf("%d%d",&m,&n);for(i = 0;i < m;i++){printf("请输入每一个顶点的名称:>");getchar();scanf("%c",&vertex[i]);}for(i = 0;i < n;i++){printf("请输入每一条边,以及边的权值:>");getchar();scanf("%c%c %d",&ch1,&ch2,&k);arcs[get_index(vertex,ch1)][get_index(vertex,ch2)] = k;//把输入的每一条边的权值存储到邻接矩阵arcs中//如果是无向网,则要把对称点也赋上权值//arcs[get_index(vertex,ch2)][get_index(vertex,ch1)] = k;}//FLOYD算法核心for(k = 0;k < m;k++){for(i = 0; i < m;i++){for(j = 0;j < m;j++){if(arcs[i][j] > arcs[i][k]+arcs[k][j]){arcs[i][j] = arcs[i][k]+arcs[k][j];MiddleVer[i][j] = k;}}}}for(i = 0; i < m;i++){for(j = 0;j < m;j++){if(i != j && arcs[i][j] != MAXINT){printf("%c->%c的权值为%d,路径为:>",vertex[i],vertex[j],arcs[i][j]);FindPath(MiddleVer, i,j,vertex);printf("\n");}}}
}
int main()
{floyd();return 0;
}
最短路径之Floyd(弗洛伊德)算法,以及显示完整路径相关推荐
- CAD设置在标题中显示完整路径
问题:想设置CAD标题中不显示完整文件路径 解决: 在OP选项设置中,取消勾选 "在标题中显示完整路径". 想显示的话就勾选. 另一个问题:想在默认启动的时候后设置标题不显示完整路 ...
- 最短路径之迪杰斯特拉(Dijkstra 算法)弗洛伊德算法(C语言完整代码实现)
写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...
- c语言 floyd优化,Floyd(弗洛伊德)算法(C语言)
Floyd算法的介绍 算法的特点 弗洛伊德算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包. 算法的思路 ...
- 有n 个长为m+1 的字符串,求前后m个字符匹配所能形成的最长字符串链:利用弗洛伊德算法求最长路径...
有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误. 把字符串看成 ...
- Linux中命令提示符显示完整路径
买了一台阿里云服务器,但是左侧的命令提示符只有用户名和主机名,每次看当前路径还要pwd一下,我感觉有点麻烦,修改环境变量一次以后都可以显示路径,"一次编译,到处运行" 操作步骤: ...
- 在Finder标题栏上显示完整路径
From: http://www.7do.net/resources-5411-1-1.html 打开终端,输入以下命令并回车: defaults write com.apple.finder _FX ...
- 最短路径之弗洛伊德算法(Floyd)——动态规划
弗洛伊德算法(Floyd)主要针对多源最短路径,且可以解决路径中有负权的情况(不包含负权回路),但是迪杰斯特拉算法只能解决正权值的单源最短路径(可以迭代多次求多源). 1.弗洛伊德算法的基本思想 弗洛 ...
- 最短路径算法——清晰简单的弗洛伊德算法(Floyd)
弗洛伊德算法(Floyd) \qquad 上一篇文章介绍了迪杰斯特拉算法(Dijkstra).具体请看:最短路径算法--简单明了的迪杰斯特拉算法(Dijkstra).Dijkstra适用于非负权图,并 ...
- 校园导航系统之用弗洛伊德算法求加权图的最短路径
其实这个示例是在大一数据结构课程设计的时候选的题目,只不过在昨天的算法分析与设计实验课上又看到了求加权图的最短路径,忽然想起当初课程设计时为了弄懂Floyd算法而不断抓狂的过程,觉得有必要将它从邮箱的 ...
最新文章
- Git统计个人提交代码行数
- fir抽取滤波器matlab,Xilinx FPGA之抽取FIR滤波器的实现
- linux下查看进程占用端口和端口占用进程命令
- js checkbox复选框实现单选功能
- 【CV秋季划】模型优化很重要,如何循序渐进地学习好?
- 活动目录的备份与还原
- android o preview 3,Android O Preview 之 通知渠道(Notification Channels)
- Ng第十二课:支持向量机(Support Vector Machines)(一)
- swfheader 0.10 Released(已更正下载地址)
- 一个短小精悍的在线jshint工具
- MYSQL性能优化分享(分库分表)
- 前端开发有哪些技术栈要掌握_为什么要掌握前端开发的这四个主要概念
- 虚数填补了数学的那一个缺口?
- 计算机系统的软件配置要求高吗,ERP软件对电脑配置有什么要求?
- MPUSH消息推送服务器搭建
- 数学分析教程(科大)——2.4笔记+习题
- Mac 安装非信任开发者软件
- 设置windows补丁自动更新指向固定服务器
- VC++界面编程之--实现工具栏自定义皮肤
- 泛泰A880 Recovery
热门文章
- SpringBoot + MyBatis + MySQL +IDEA2021 增删改查 2021-06-04
- 【c#】服务端客户端连接类
- 前端小白初识CMD(dos窗口命令)
- 项目经理考PMP,薪资会提高吗?
- 小白也能学会的调色教程,你学会了吗?
- 【C语言】[其他] :code, data, idata, xdata, bdata, edata, hdata等,代表的意思
- glGenTextures(GLsizei n, GLuint *textures)函数说明
- 如何清理windows server 2008 R2 中winsxs文件夹
- 定时任务二:No thread-bound request found
- CAD如何快速查找图纸的存放位置?怎么实现快速看图?