[C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)
1 Floyd算法
1.1 解决问题/提出背景
- 多源最短路径(带权有向图中,求每一对顶点之间的最短路径)
- 方案一:弗洛伊德(Floyd算法)算法
- 算法思想:动态规划法
- 时间复杂度:O(n^3)
- 形式上,相对较为简单
- 方案二:分别以图中的每个顶点为源点,共调用【n次】【迪杰斯特拉(Dijkstra)算法】
- 算法思想:贪心算法
- 时间复杂度:O(n^3)
- 形式上,相对较为复杂
- 补充
- Dijkstra算法主要应用于:求解【单源最短路径】
- 方案一:弗洛伊德(Floyd算法)算法
1.2 算法描述
1.3 编程复现
- 1> 定义图模型(邻接矩阵表示法)的基本存储结构体
# define MaxInt 32767 // 表示极大值 即 ∞ (无穷大)
# define MVNum 100 // 最大顶点数
typedef int VertexType; // 假设顶点的数据类型为整型
typedef int ArcType; // 假设Vi与Vj之边的权值类型为整型
typedef struct {
VertexType vexs[MVNum]; // 顶点表 (存储顶点信息)
ArcType arcs[MVNum][MVNum]; // 邻接矩阵
int vexnum,arcnum; // 图的当前顶点数与边数
}AMGraph; // Adjacent Matrix Graph 邻接矩阵图
- 2> 定义Floyd算法的辅助数据结构体
ArcType D[MVNum][MVNum]; // 记录顶点Vi和Vj之间的最短路径长度
int Path[MVNum][MVNum]; // 最短路径上顶点Vj的前一顶点的序号
- 3> 初始化(邻接矩阵)带权有向图的图模型
void InitAMGraph(AMGraph &G){
cout<<"Please Input Vertexs Number:";
cin>>G.vexnum;
cout<<"\nPlease Directed Edge Number:";
cin>>G.arcnum;
for(int i=0;i<MVNum;i++){
for(int j=0;j<MVNum;j++){
if(i!=j){ // 【易错】 初始化<Vi, Vj>时: <Vi,Vj> 路径长度无穷大 (i!=j)
G.arcs[i][j] = MaxInt;
} else { // 【易错】 初始化<Vi, Vj>时: <Vi,Vi>【自回环】路径长度为0 (i==i)
G.arcs[i][j] = 0;
}
}
}
for(int i=0;i<G.vexnum;i++){
G.vexs[i] = i;
}
cout<<"\nPlease Input All Directed Edges and their Weight now:";
cout<<"\nDirected Edges(i,j,weight): "<<endl;
int i,j;
int weight;
for(int k=0;k<G.arcnum;k++){
cin>>i;cin>>j;cin>>weight;
G.arcs[i][j] = weight;
}
cout<<endl;
}
- 4> Floyd算法:求解多源最短路径
void ShortestPath_Floyd(AMGraph G){
//step1 初始化各对结点的已知路径和距离
for(int i=0;i<G.vexnum;i++){
for(int j=0;j<G.vexnum;j++){
D[i][j] = G.arcs[i][j]; //D[i][j] 初始化
if(D[i][j]<MaxInt && i!=j){ // 【易漏】 i != j (防止产生自回环)
Path[i][j] = i; // 若 Vi与Vj之间存在弧(有序顶点对): 将Vj的前驱置为 Vi
} else {
Path[i][j] = -1;
}
}
}
//step2 动态规划(DP)动态更新: <Vi,Vj>更短的最短路径的距离和路径
for(int k=0;k<G.vexnum;k++){ // 【易错】 中间结点Vk的循环 是在最外层
for(int i=0;i<G.vexnum;i++){
for(int j=0;j<G.vexnum;j++){
if(D[i][k] + D[k][j] < D[i][j]){ // 若从Vi【经Vk】到Vj的一条路径更短
D[i][j] = D[i][k] + D[k][j]; // 更新D[i][j]
Path[i][j] = Path[k][j]; // 【易错】 更改Vj的前驱为 Vk
}
}
}
}
}
- 5> 输出结果 D[i][j] 、Path[i][j]
- 二维数组D[i][j]【最短路径长度】、二维数组Path[i][j]【最短路径权重】
void OutputD(AMGraph G){
cout<<"Shortest Distance Weight of the Pair of Directed Vertices:"<<endl;
for(int i=0;i<G.vexnum;i++){
for(int j=0;j<G.vexnum;j++){
cout<<D[i][j]<<"\t";
}
cout<<endl;
}
}
void OutputPath(AMGraph G){
cout<<"Shortest Distance Path(i,j) of the Pair of Directed Vertices:"<<endl;
for(int i=0;i<G.vexnum;i++){
for(int j=0;j<G.vexnum;j++){
cout<<Path[i][j]<<"\t";
}
cout<<endl;
}
}
- 6> 执行:Main函数
int main(){
AMGraph G;
InitAMGraph(G);//易错处
ShortestPath_Floyd(G); // 【重/难点】易错处
OutputD(G);
OutputPath(G);
return 0;
}
- 7> Output of Main
Please Input Vertexs Number:4
Please Directed Edge Number:8
Please Input All Directed Edges and their Weight now:
Directed Edges(i,j,weight):
0 1 1
1 3 2
2 0 3
0 3 4
2 1 5
3 2 6
2 3 8
1 2 9
Shortest Distance Weight of the Pair of Directed Vertices:
0 1 9 3
11 0 8 2
3 4 0 6
9 10 6 0
Shortest Distance Path(i,j) of the Pair of Directed Vertices:
-1 0 3 1
2 -1 3 1
2 0 -1 1
2 0 3 -1
2 参考文献
- 《数据结构(C语言版/ 严蔚敏 李冬梅 吴伟民 编)》
[C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)的更多相关文章
- [算法] Dijkstra算法(带权有向图 最短路径算法)
一.带权有向图 二.算法原理 1)由于我们的节点是从1-6,所以我们创建的列表或数组都是n+1的长度,index=0的部分不使用,循环范围为1-6(方便计算). 2)循环之前,我们先初始化dis数组和 ...
- HIT 2739 - The Chinese Postman Problem - [带权有向图上的中国邮路问题][最小费用最大流]
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2739 Time limit : 1 sec Memory limit : 64 M A Chinese ...
- 有向网络(带权的有向图)的最短路径Dijkstra算法
什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...
- 带权图的最短路径算法(Dijkstra)实现
一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...
- [C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)
1 Dijkstra算法 1.1 算法基本信息 解决问题/提出背景 单源最短路径(在带权有向图中,求从某顶点到其余各顶点的最短路径) 算法思想 贪心算法 按路径长度递增的次序,依次产生最短路径的算法 ...
- Dijkstra 单源最短路径算法
Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...
- Bellman-Ford 单源最短路径算法
Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Bellman 和 Leste ...
- 单源最短路径算法---Dijkstra
Dijkstra算法树解决有向图G=(V,E)上带权的单源最短路径问题,但是要求所有边的权值非负. 解题思路: V表示有向图的所有顶点集合,S表示那么一些顶点结合,从源点s到该集合中的顶点的最终最短路 ...
- Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32824 Accepted: 11098 Description Bes ...
随机推荐
- WCF Endpoint分类
WCF中可以为一个Service配置多个Endpoint 这些Endpoint的分类方法有下面3中 1.全局就一个endpoint,一个接口公开所有的方法,这适合简单的业务场景 2.将endpoint ...
- JavaScript005,语法
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- [ 转载 ]hashCode方法的相关用法
想要明白hashCode的作用,你必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 你知道它们的区别吗?前者集合内的元素是有 ...
- .NET界面开发新体验!DevExpress v19.2.4全新来袭
DevExpress Universal Subscription(又名DevExpress宇宙版或DXperience Universal Suite)是全球使用广泛的.NET用户界面控件套包,De ...
- Spring boot dubbo+zookeeper 搭建------基于gradle项目的消费端与服务端分离实战
1. Dubbo简介 Dubbo是Alibaba开源的分布式框架,是RPC模式的一种成熟的框架,优点是可以与Spring无缝集成,应用到我们的后台程序中.具体介绍可以查看Dubbo官网. 2. Why ...
- 【安卓基础】WebView开发优化基础
最近工作很忙,不仅要抽空进行管理,还有开发任务在身,幸好有一些规划进行指导,所以还能顺利解决问题.在管理和技术上面,我认为技术是硬实力,管理是软实力,自己需要多点时间花在技术上. 回归正题,在项目中的 ...
- 参数类型 (@Service层) impl
@Override public List<Map<String, Object>> selectAdvListByPosition(String adStructure, P ...
- CKEditor本地图片自动上传插件
由于工作需要必须将word文档内容粘贴到编辑器中使用 但发现word中的图片粘贴后变成了file:///xxxx.jpg这种内容,如果上传到服务器后其他人也访问不了,网上找了很多编辑器发现没有一个能直 ...
- CF1197B
CF1197B 题意: 出n个柱子,每个柱子一个圆盘,其半径各不相同,每次只能将柱子上只有一个圆盘的移到相邻位置,问能否全部移到一个柱子上. 解法: 思路题. 如果所有盘子都能移动到同一个柱子上,那么 ...
- Logback 日志策略配置
[参考文章]:官方文档:Logback configuration [参考文章]:logback的使用和logback.xml详解 [参考文章]:Logback源码赏析-日志按时间滚动(切割) 1. ...