一、Floyd算法简介

Floyd(弗洛伊德)算法相对于Dijkstra算法来说,可以解决多源最短路径问题(即可以从任意一个点到任意一个点),可应用于地图导航走最短路径、为各城市修建最短路径的通信网(节省成本)等问题,时间复杂度是

二、代码部分

2.1.Graph.h文件代码

#ifndef GRAPH_H
#define GRAPH_H
#include <algorithm>
#include <stdio.h>    // exit()函数需要用到的头文件
#define X 9999  //相当于无穷大class Graph
{private:static Graph* instance;        //创建实例:类是一个抽象类,实例可方便用于调取类成员的方法函数int n, m; //n是顶点个数,m是边数char* data;     //顶点数组,用来储存顶点(char类型)int** w;    //weight 边的权重,邻接矩阵int** path; //用来记录最小边权值顶点的序号,邻接矩阵public:Graph();virtual ~Graph();       //虚析构函数,用来程序结束后释放new的内存static Graph* getInstance();  //获取实例void createGraph(Graph& G);int getIndex(const Graph& G, char v);  //获取顶点v的在顶点数组data中的下标void Floyd(Graph& G);void showPath(const Graph& G, int u, int v);  //展示最短路径};
#endif // GRAPH_H

2.2.Graph.cpp文件代码

#include "Graph.h"
#include <iostream>
using namespace std;Graph::Graph() //默认构造
{// ctor
}Graph *Graph::instance = nullptr; //固定套路
Graph *Graph::getInstance()       //同上,记住就好,也可以自己尝试理解下
{if (!instance)instance = new Graph();return instance;
}int Graph::getIndex(const Graph &G, char v) //获取顶点v在顶点数组中的下标
{for (int i = 0; i < G.n; i++)if (G.data[i] == v)return i;return -1; //没找到就返回-1
}void Graph::createGraph(Graph &G)
{cout << "please input the number of vertex and arc:";cin >> G.n >> G.m;G.data = new char[G.n]; //动态创建一维数组cout << "please input the value of vertice:";for (int p = 0; p < G.n; p++)cin >> G.data[p];char v1, v2;int power, i, j;G.w = new int *[G.n]; //动态创建二维数组,申请了 int* 类型的G.n行空间for (int s = 0; s < G.n; s++)G.w[s] = new int[G.n]; //每一行申请一个int类型的G.n列空间for (int x = 0; x < G.n; x++)for (int y = 0; y < G.n; y++){if (x == y)G.w[x][y] = 0; //边的邻接矩阵中左对角线权重(即自己的权重)都设为0,因为是多源的elseG.w[x][y] = X; //其他边的权重初始化为无穷大}cout << "please input the weight of arc between 2 vertice as 100 A B:" << endl;for (int k = 0; k < G.m; k++){cin >> power >> v1 >> v2;i = getIndex(G, v1);j = getIndex(G, v2);if (i == -1 || j == -1){ //没在顶点数组中找到对应的顶点下标cout << "Sorry, I can't find the vertex" << endl;exit(-1); //直接退出程序}G.w[i][j] = power; //有向图赋值边的权重}
}void Graph::Floyd(Graph &G)
{G.path = new int *[G.n]; //动态创建二维数组for (int s = 0; s < G.n; s++){G.path[s] = new int[G.n];for (int t = 0; t < G.n; t++)G.path[s][t] = -1; //初始化path邻接矩阵的值}//特别注意:不能用fill函数来初始化动态二维数组,因为动态new出来的空间不一定连续for (int v = 0; v < G.n; ++v) // v是指在某两个点中,它们之间点的下标for (int i = 0; i < G.n; ++i)for (int j = 0; j < G.n; ++j)if (G.w[i][j] > G.w[i][v] + G.w[v][j]) //看配合B站视频讲解效果更棒,这里不多做解释!{G.w[i][j] = G.w[i][v] + G.w[v][j];G.path[i][j] = v;}
}void Graph::showPath(const Graph &G, int u, int v)
{ //看配合B站视频讲解效果更棒,该函数不多做解释!if (G.path[u][v] == -1)cout << G.data[u] << " to " << G.data[v] << endl; // B站输出的是顶点序号,我这输出的是顶点的值else{int mid = G.path[u][v];showPath(G, u, mid);showPath(G, mid, v);}
}Graph::~Graph() //虚析构函数作用:一般都是用来程序结束后释放new出来的内存
{delete[] data;for (int i = 0; i < n; i++)delete[] w[i];delete[] w;for (int i = 0; i < n; i++)delete[] path[i];delete[] path;
}

2.3.main.cpp文件代码

#include <iostream>
#include "Graph.h" //自己写的头文件要用引号
#include "Graph.cpp"
using namespace std;int main()
{char v1, v2;int a, b;Graph G;Graph::getInstance()->createGraph(G); //用实例来调取抽象类的函数方法Graph::getInstance()->Floyd(G);cout << "please input which two vertice you want to show the shortest path between them:";cin >> v1 >> v2;a = Graph::getInstance()->getIndex(G, v1);b = Graph::getInstance()->getIndex(G, v2);Graph::getInstance()->showPath(G, a, b);return 0;
}// 6 11
// 1 2 3 4 5 6
// 3 1 2
// 3 2 1
// -4 1 4
// 4 2 3
// 4 3 2
// -3 3 6
// 4 4 5
// 4 5 4
// -1 5 2
// 3 5 6
// 3 6 5

三.例子介绍

please input the number of vertex and arc:6 11
please input the value of vertice:1 2 3 4 5 6
please input the weight of arc between 2 vertice as 100 A B:
3 1 2
3 2 1
-4 1 4
4 2 3
4 3 2
-3 3 6
4 4 5
4 5 4
-1 5 2
3 5 6
3 6 5
please input which two vertice you want to show the shortest path between them:6 1

Output:
6 to 5
5 to 2
2 to 1

动态规划-Floyd Warshall(佛洛依德) algorithm相关推荐

  1. [图] Floyd算法|佛洛依德 - 任意两点的最短路径 - C语言实现

    文章目录 原理 核心代码 代码 path[][]数组解释 完整代码 原文链接:https://www.yuque.com/cppdev/algo/bgt4ea 原理 [Floyd算法]用动态规划的思想 ...

  2. Java实现佛洛依德算法(floyd)的完整代码

    Java实现佛洛依德算法(floyd)的完整代码 /*** 弗洛伊德(floyd)算法求图中所有点对之间的最短路径:* 其中'-1'表示两点之间目前还没有联通的路径:* 结论:如果A点到G点之间有最短 ...

  3. 最短路径算法之迪杰斯特拉算法(Dijkstra)和佛洛依德算法(Floyd)

    今天学习了这两种算法,都是用来求最小路径的算法,但是迪杰斯特拉算法只能从某个特定点到所有点的最短路径,而佛洛依德算法可以查出任意点到任意点的最小路径. 迪杰斯特拉: package dijkstra; ...

  4. 十大常用算法之佛洛依德算法

    十大常用算法的完整实现 一.二分查找算法:https://blog.csdn.net/weixin_46635575/article/details/121532149 二.分治算法:https:// ...

  5. 最短路径算法 迪杰斯特拉、佛洛依德和贝尔曼

    最短路径算法 迪杰斯特拉算法 佛洛依德算法 迪杰斯特拉算法 迪杰斯特拉算法用来解决在有向有权图中某一个点到任意一点的最短路径问题. 注意:只能用来解决权为非零的情况,不能够解决权为负数的情况 思想:我 ...

  6. 佛洛依德算法C语言简单实现

    计算图中每个顶点间的最短路径及路径长度 采用邻接矩阵表示图 代码如下: #include <stdio.h> #include <windows.h> #include < ...

  7. 推免复习之数据结构与算法 佛洛依德算法

    佛洛依德算法算法作为一个经典的求最短路径的算法,思路其实很简单,就是不停地进行"松弛操作",直到全部遍历一遍.那么什么是松弛操作呢?比如说我们的图存在一个邻接矩阵graph中,gr ...

  8. 佛洛依德算法求最短路径(记录路径信息)

    佛洛依德算法: 利用D矩阵拿到邻接矩阵中的权值.path矩阵记录两点之间的移动中转点(初始值为起点). 对于邻接矩阵中 i 到 j 点的权值进行比较,若加上一个中转点 k 后的权值小于原本的权值,则对 ...

  9. 佛洛依德 c++ 最短路径算法

    1 //20142880 唐炳辉 石家庄铁道大学 2 #include<iostream> 3 #include<string> 4 using namespace std; ...

最新文章

  1. java正则表达式获取指定两个字符串之间内容
  2. 太火!这本AI图书微软强推,程序员靠它拿下50K!
  3. android-sdk-windows下载版
  4. python知乎-知乎大佬李启方道出肺腑之言:为什么我不建议你学Python?
  5. 二 DeepinV20版本安装
  6. MySQL数据库从入门到实战(四)
  7. hihocoder #1136 : Professor Q's Software
  8. 【Python基础】必知必会的8个Python列表技巧
  9. 定义整型数组_C++数组的定义与初始化(学习笔记:第6章 01)
  10. 1539. 第 k 个缺失的正整数
  11. 网络服务考试(通过率50%)
  12. python萤火虫算法_一种萤火虫算法优化神经网络的短期负荷预测方法与流程
  13. Switch / Xbox / PS / PSV / PSP 游戏指南
  14. app账号退不出去_2021个人所得税退税时间是什么时候?还可以退吗?
  15. R语言Kmeans聚类分析
  16. PPT中表格的插入与结构调整
  17. 【立贴为证】二十年后2027,百度眼必然成人眼一个
  18. 第九十七章 SQL函数 MONTH
  19. Shader实现马赛克
  20. 各种本地存储对比 cookie,localStorage,sessionStorage,indexDB以及他们和vuex的区别

热门文章

  1. 软件打包教程(NSIS)
  2. CIO 和 CTO 有什么区别 ?CEO 视角下的 CIO 和信息化建设
  3. Genymotion模拟器常见问题
  4. python3 excel样式_python3my使用python.pandas修改excel样式
  5. MD常用写法——Markdown
  6. 买房上瘾!甲骨文CEO埃里森4800万美元再添一豪宅
  7. 垂直切变对热带气旋的影响
  8. QC访问时出现没有注册类别提示
  9. 学习!important用法
  10. 关于SQLserver2016数据库处于恢复挂起状态的解决方案