【数据结构】最短路径——Floyd算法

一.问题描述

给定带权有向图G=(V,E),对任意顶点$v_i,v_j$ $\in$V (i$\neq$j),求顶点$v_i$到顶点$v_j$的最短路径。

转化为:

多源点最短路径求解问题

解决方案一:

每次以一个顶点为源点调用Dijksra算法。时间复杂度为O($n^3$)

解决方法二:

Floyd算法

二.弗洛伊德算法的基本思想

        对于从$v_i$$v_j$的弧,进行n次试探:首先考虑路径$v_i,v_0,v_j$是否存在,如果存在,则比较$v_i,v_j$$v_i,v_0,v_j$的路径长度,取较短者为从$v_i$$v_j$的中间顶点的序号不大于0的最短路径。在路径上再增加一个顶点$v_1$,以此类推,在经过n次比较后,最后求得从顶点$v_i$$v_j$得最短路径。

三.弗洛伊德算法的实现

#include <iostream>
#include <cstring>
#include <stack>
using namespace std;const int MAX_VERTEX=10;//带权(邻接矩阵)有向图
class MGraph{
private:int arc[MAX_VERTEX][MAX_VERTEX];//邻接矩阵int vertex[MAX_VERTEX];//存储每个结点的信息int vertexNum,arcNum;//实际顶点个数,边的条数
public:MGraph(int n,int e);void Dijkstra(int start);int findMinDist(int dist[],int s[]);void display();void displayPath(int dist[],int path[],int start,int min);void Floyd();char* string_concatenation(char *s1,char *s2);
};
int main(int argc, const char * argv[]) {MGraph G(5, 7);G.display();G.Floyd();//G.Dijkstra(0);//ALGraph G(7, 10);//G.topology();return 0;
}
MGraph::MGraph(int n,int e){int p,q,w;vertexNum=n;arcNum=e;for(int i=0;i<n;i++){//初始化邻接矩阵for(int j=0;j<n;j++){arc[i][j]=-1;//-1表示不可到达}}for(int i=0;i<n;i++){vertex[i]=i;arc[i][i]=0;}for(int i=0;i<e;i++){cin>>p>>q>>w;arc[p][q]=w;}
}
void MGraph::Floyd(){int dist[vertexNum][vertexNum],i,j,k;char* path[vertexNum][vertexNum];for(i=0;i<vertexNum;i++){//初始化for(j=0;j<vertexNum;j++){//path,dist数组初始化dist[i][j]=arc[i][j];if(arc[i][j]!=-1){path[i][j]=new char[3];path[i][j][0]=i+'a';path[i][j][1]=j+'a';path[i][j][2]='\0';}else{path[i][j]=new char[1];path[i][j][0]='\0';}}}for(k=0;k<vertexNum;k++){for(i=0;i<vertexNum;i++){for(j=0;j<vertexNum;j++){if(dist[i][k]!=-1&&dist[k][j]!=-1){if(dist[i][j]>dist[i][k]+dist[k][j]||dist[i][j]==-1){dist[i][j]=dist[i][k]+dist[k][j];delete [] path[i][j];path[i][j]=string_concatenation(path[i][k], path[k][j]);}}}}}for(i=0;i<vertexNum;i++){for(j=0;j<vertexNum;j++){if(j!=i){cout<<path[i][j]<<endl;}delete [] path[i][j];}}
}char* MGraph::string_concatenation(char *s1,char *s2){int len1=(int)strlen(s1);int len2=(int)strlen(s2);int k=1,i;const int n=len1+len2;char *path=new char[n];for(i=0;i<len1;i++){path[i]=s1[i];}for(;i<len1+len2-1;i++){path[i]=s2[k++];}path[i]='\0';return path;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于yolov8-道路裂缝检测

1 介绍 本文主要是搜集数据&#xff0c;从网上kaggle等网站找了2000多张图片&#xff0c;然后使用yolov8模型进行训练&#xff0c;最后只展示训练过程中的图片&#xff0c;如果有需要&#xff0c;可以联系&#xff1a;https://docs.qq.com/doc/DWEtRempVZ1NSZHdQ。

在线学习平台-需求分析(Java)

需求分析 研发集管理员、教务、教师、学生四种权限一体的中后台教务服务管理系统。其中管理员能够开设账号与角色分配&#xff0c;控制系统权限&#xff1b;教务能够进行班级管理、学员管理&#xff1b;教师能够进行课程与教学资源发布、作业发布与批改&#xff1b;学生能够观…

力扣刷题day1(两数相加,回文数,罗马数转整数)

题目1&#xff1a;1.两数之和 思路1和解析&#xff1a; //1.暴力枚举解法(历遍两次数组&#xff0c;时间复杂度O&#xff08;N^2)&#xff0c;空间复杂度O&#xff08;1&#xff09; int* twoSum(int* nums, int numsSize, int target, int* returnSize) {for (int i 0; i &…

【Selenium+Webmagic】基于JAVA语言实现爬取js渲染后的页面,附有代码

事先声明 笔者最近需要查看一些数据&#xff0c;自己挨个找太麻烦了&#xff0c;于是简单的学了一下爬虫。笔者在这里声明&#xff0c;爬的数据只为学术用&#xff0c;没有其他用途&#xff0c;希望来这篇文章学习的同学能抱有同样的目的。 枪本身不坏&#xff0c;坏的是使用枪…

如何制作教育培训小程序

教育培训行业近年来发展迅速&#xff0c;越来越多的机构开始意识到通过小程序来提供在线教育服务的重要性。小程序不仅可以为用户提供便捷的学习体验&#xff0c;还可以增加机构的知名度和品牌影响力。那么&#xff0c;如何制作一款教育培训小程序呢&#xff1f; 首先&#xff…

sqlmap400报错问题解决

python sqlmap.py -r sql.txt --batch --techniqueB --tamperspace2comment --risk 3 --force-ssl–batch 选项全部默认 不用再手动输入 –techniqueB 使用布尔盲注&#xff0c;该参数是指出要求使用的注入方式 –tamperspace2comment使用特殊脚本&#xff0c;space2comment是把…

【MySQL语言汇总[DQL,DDL,DCL,DML]以及使用python连接数据库进行其他操作】

MySQL语言汇总[DQL,DDL,DCL,DML] SQL分类1.DDL:操作数据库&#xff0c;表创建 删除 查询 修改对数据库的操作对表的操作复制表&#xff08;重点&#xff09;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 2.DML:增删改表中数据3.DQL&#xff1a;查询表中的记录…

jsp在线辅助教育系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 在线辅助教育系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

工厂生产数据展示基本布局Demo(提供素材)

效果图&#xff1a; <template><div class"app-container"><a-row :span"24"><a-col :span"12"><div class"divBox"><div class"flexBoxs"><div style"margin: 2px 5px;"…

在windows server系统下,快速部署自己的网站

目录 xampp简介xampp的作用xampp的安装方法Apache简介Apache的作用 本文主要介绍使用xampp软件包在windows server系统下&#xff0c;快速部署自己的网站。 xampp简介 XAMPP是一款基于Apache、MySQL、PHP和Perl的开源Web服务器软件包。XAMPP支持多个操作系统&#xff0c;包括W…

go写文件后出现大量NUL字符问题记录

目录 背景 看看修改前 修改后 原因 背景 写文件完成后发现&#xff1a; size明显也和正常的不相等。 看看修改前 buf : make([]byte, 64) buffer : bytes.NewBuffer(buf)// ...其它逻辑使得buffer有值// 打开即将要写入的文件&#xff0c;不存在则创建 f, err : os.Open…

MySQL数据备份

一、逻辑备份 备份的是建表、建库、插入等操作所执行SQL语句&#xff0c;适用于中小型数据库&#xff0c;效率相对较低。 本质&#xff1a;导出的是SQL语句文件 优点&#xff1a;不论是什么存储引擎&#xff0c;都可以用mysqldump备成SQL语句 缺点&#xff1a;速度较慢&…

Mysql分布式集群部署---MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上

1.1 目的 部署MysqlCluster集群环境 1.2 MySQL集群Cluster原理 1 数据分片 MySQL集群Cluster将数据分成多个片段&#xff0c;每个片段存储在不同的服务器上。这样可以将数据负载分散到多个服务器上&#xff0c;提高系统的性能和可扩展性。 2. 数据同步 MySQL集群Cluster使…

c++--运算符重载

1.重载的运算符 (1).重载运算符函数的参数数量与该运算符作用的运算对象数量一样多。 (2).除了重载的函数调用运算符operator()之外&#xff0c;其他重载运算符不能含有默认实参。 (3).对一个重载的运算符&#xff0c;其优先级和结合律与对应的内置运算符保持一致。 (4).当一个…

2022年全国大学生数据分析大赛医药电商销售数据分析求解全过程论文及程序

2022年全国大学生数据分析大赛 医药电商销售数据分析 原题再现&#xff1a; 问题背景   20 世纪 90 年代是电子数据交换时代&#xff0c;中国电子商务开始起步并初见雏形&#xff0c;随后 Web 技术爆炸式成长使电子商务处于蓬勃发展阶段&#xff0c;目前互联网信息碎片化以…

css实现正六边形嵌套圆心

要实现一个正六边形嵌套圆心&#xff0c;可以使用CSS的::before和::after伪元素以及border-radius属性。以下是具体的解析和代码&#xff1a; 使用::before和::after伪元素创建正六边形。设置正六边形的背景色。使用border-radius属性使正六边形的内角为60度。在正六边形内部创…

【matlab程序】matlab画子图的多种样式

【matlab程序】matlab画子图的多种样式

【漏洞复现】速达软件存在任意文件上传

漏洞描述 速达软件全系产品存在任意文件上传漏洞,未经身份认证的攻击者可以通过此漏洞上传恶意后门文件,执行任意指令,造成服务器失陷 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、…

fastadmin列表头部按钮批量上传视频

上传界面通过layui生成 index.html <a href="{:url(video/piliangadd)}" class="btn btn-success btn-piliangadd btn-dialog {:$auth->check(video/piliangadd)?:hide}" title="批量上传" ><i class="fa fa-plus">…

flask之邮件发送

一、安装Flask-Mail扩展 pip install Flask-Mail二、配置Flask-Mail 格式&#xff1a;app.config[参数]值 三、实现方法 3.1、Mail类 常用类方法 3.2、Message类&#xff0c;它封装了一封电子邮件。构造函数参数如下&#xff1a; flask-mail.Message(subject, recipient…