佛洛依德算法求最短路径实例

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>using namespace std;
//最多的地点数量
const int MAX_VALUE = 30;//存储最短路径值
int ShortestPathvalue[MAX_VALUE][MAX_VALUE] = {0};
//存储具体路径
int ShortestPathmatrix[MAX_VALUE][MAX_VALUE] = {0};
//地点信息
char _mapName[MAX_VALUE][50] = {};
//距离信息,_distance[0][1] = 50;代表从下标为0到下表为1地点距离为50
int _distance[MAX_VALUE][MAX_VALUE] = {0};
//边表结点
typedef struct EdgeNode {//顶点对应的下标int adjvex;//权值int weight;//指向下一个邻接点struct EdgeNode *next;
} edgeNode;//邻接表 //顶点表结点
typedef struct VertexNode {//顶点数据char data[50];//边表头指针edgeNode *firstedge;
} VertexNode, AdjList[100];//邻接矩阵 //集合
typedef struct {AdjList adjList;//顶点数和边数int numVertexes, numEdges;
} GraphAdjList;// 结构体 class AdjacencyList {public:void ShowALGraph(GraphAdjList *G);void Test();//初始化地图void InitMap(GraphAdjList *G);//创建地图void CreateALGraph(GraphAdjList *G);//计算各个顶点之间最短路径void ShortestPath_Floyd(GraphAdjList *G, int P[MAX_VALUE][MAX_VALUE], int D[MAX_VALUE][MAX_VALUE]);//输出路径长度和具体路径void ShowShortestResult(int originPos,int endPos);
};void AdjacencyList::CreateALGraph(GraphAdjList *G) {edgeNode *e;//读入顶点信息,建立顶点表for (int i = 0; i < G->numVertexes; i++){//读入顶点信息strcpy(G->adjList[i].data, _mapName[i]);//将边表置为空表G->adjList[i].firstedge = NULL;}//建立边表(头插法)for (int i = 0; i < G->numVertexes; i++){for (int j = 0; j < i; j++){int temp;if (_distance[i][j] != 0 || _distance[j][i] != 0){if (_distance[i][j] != 0){temp = _distance[i][j];_distance[j][i] = _distance[i][j];}else{temp = _distance[j][i];_distance[i][j] = _distance[j][i];}e = new EdgeNode;e->adjvex = j;e->next = G->adjList[i].firstedge;e->weight = temp;G->adjList[i].firstedge = e;e = new EdgeNode;e->adjvex = i;e->next = G->adjList[j].firstedge;e->weight = temp;G->adjList[j].firstedge = e;}}}}void AdjacencyList::Test() {cout << "ALL IS OK." << endl;
}void AdjacencyList::ShowALGraph(GraphAdjList *G) {for (int i = 0; i < G->numVertexes; i++){cout << "顶点" << i << ": " << G->adjList[i].data << "--firstedge--";edgeNode *p = new edgeNode;p = G->adjList[i].firstedge;while (p){cout << p->adjvex << "--Weight: " << p->weight << "--Next--";p = p->next;}cout << "--NULL" << endl;}}void AdjacencyList::InitMap(GraphAdjList *G) {printf("请输入顶点数和边数,用空格隔开数字:\n");//输入顶点数和边数G->numVertexes = 0;G->numEdges = 40;scanf("%d%d", &G->numVertexes, &G->numEdges);printf("请输入每个地点的名称:\n");for(int i = 0; i < G->numVertexes; i++){printf("请输入第%d个地点的名称:\n", i);cin>>_mapName[i];}printf("请输入每个起始地点、目的地点和距离,用空格隔开数字:\n");for(int i = 0; i < G->numEdges; i++){int a, b, dis;scanf("%d%d%d", &a, &b, &dis);_distance[a][b] = dis;}
}void AdjacencyList::ShortestPath_Floyd(GraphAdjList *G, int P[MAX_VALUE][MAX_VALUE], int D[MAX_VALUE][MAX_VALUE]) {//初始化D与Pfor (int v = 0; v < G->numVertexes; ++v){for (int w = 0; w < G->numVertexes; ++w){if(_distance[v][w]==0&&v!=w){_distance[v][w] = 10000;}D[v][w] = _distance[v][w];P[v][w] = w;}}for (int k = 0; k < G->numVertexes; ++k){for (int v = 0; v < G->numVertexes; ++v){for (int w = 0; w < G->numVertexes; ++w){if (D[v][w] > D[v][k] + D[k][w]){D[v][w] = D[v][k] + D[k][w];P[v][w] = P[v][k];}}}}}void AdjacencyList::ShowShortestResult(int originPos,int endPos) {int temp;cout << "地点" << _mapName[originPos] << "到地点" << _mapName[endPos] << "最短距离为" << ShortestPathvalue[originPos][endPos] << endl;temp = ShortestPathmatrix[originPos][endPos];cout<<"具体路径为:"<<_mapName[originPos]<<"——>";while (temp!=endPos){cout<<_mapName[temp]<<"——>";temp = ShortestPathmatrix[temp][endPos];}cout<<_mapName[endPos]<<endl;
}int main() {AdjacencyList adjacencyList;int originPos,endPos;GraphAdjList *GA = new GraphAdjList;adjacencyList.Test();adjacencyList.InitMap(GA);adjacencyList.CreateALGraph(GA);adjacencyList.ShortestPath_Floyd(GA,ShortestPathmatrix,ShortestPathvalue);while(1){printf("请输入操作类别,0:计算最短路径  1:添加地点  2:添加路径  3:更改路径  \n");int type = 0;cin>>type;if(type == 0){cout<<"请输入两个地点之间的代号,系统会为你自动计算最短路径!" <<endl;cin>>originPos>>endPos;adjacencyList.ShowShortestResult(originPos,endPos);}else if(type == 1){printf("已分配ID[%d],请输入新地点的名称:\n", GA->numVertexes++);cin>>_mapName[GA->numVertexes - 1];}else if(type == 2 || type == 3){printf("请输入起始地点、目的地点和距离,用空格隔开数字:\n");int a, b, dis;scanf("%d%d%d", &a, &b, &dis);_distance[a][b] = dis;memset(ShortestPathmatrix, 0 , sizeof ShortestPathmatrix);memset(ShortestPathvalue, 0 , sizeof ShortestPathvalue);adjacencyList.CreateALGraph(GA);adjacencyList.ShortestPath_Floyd(GA,ShortestPathmatrix,ShortestPathvalue);}}return 0;
}

运行程序后显示的界面
插入数据

演示其中一个功能

佛洛依德算法求最短路径实例相关推荐

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

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

  2. 佛洛依德算法求各个结点到各个结点的最短路径

    package Algorithm;import java.util.Arrays;public class Floyd {public static void main(String[] args) ...

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

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

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

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

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

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

  6. 迪杰斯特拉算法与佛洛依德算法

    迪杰斯特拉算法用于计算:某点v0到其他所有点的最短路径,时间复杂度为O(n^2) 初态: 设定V为所有顶点的集合. 设定S为已经得到的最短路径的顶点vi的集合.即S中的顶点vi,都是已经确定下来v0到 ...

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

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

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

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

  9. 佛洛依德算法的学习与实现

    1.问题引入 带权有向图中单源点的最短路径问题可以用地杰斯特拉算法求解,如果要求解图中每一对顶点之间的最短路径,类似可以想到的方法为:每次以一个顶点为源点,重复执行地杰斯特拉算法算法n次,这样,便可以 ...

最新文章

  1. 【BZOJ 3879】SvT
  2. 读张鸣-《辛亥:摇晃的中国》感
  3. 【C/C++】main函数之参数argc和argv含义及用法
  4. 20天掌握C语言,C语言零基础到项目实战,玩转C语言
  5. 如何帮助金融客户“用好云”?
  6. mvc 扫描jar jsp_SpringBoot+jsp项目启动出现404
  7. 使用VS2010+OpenCV2.4.9简单图像水印代码
  8. qt程序部署在linux,Qt应用打包发布,部署真正的Qt程序LinuxWindows-Go语言中文社区...
  9. e5 2630v4 php性能,至强E5 V4性能表现测试
  10. 第6章—渲染web视图—使用Thymeleaf
  11. 天勤数据结构代码——树基本操作
  12. 全国市场调查大赛经验分享(二)
  13. 看到强烈的太阳光你会不由自主的打喷嚏吗?
  14. 【扩展作业分享】JAVA, 数据结构与算法, 操作系统,大数据可视化,游戏制作
  15. K210使用MaixPy IDE长时间显示连接中的解决方案
  16. 【转】实习中,我怎样学习和工作
  17. JAVA通过Hutool解析CSV文件【导入即用,无需封装】
  18. 从MUD到MMO——虚拟世界发展简史以及未来可能性的杂谈
  19. 中文信息处理——纵览与建议
  20. Spring3.0.5源码扩展支持AOP 获取HttpServletResponse

热门文章

  1. 【FPGA教程案例100】深度学习1——基于CNN卷积神经网络的手写数字识别纯Verilog实现,使用mnist手写数字数据库
  2. Open3d 曲面滤波
  3. 一文带你了解 ZigBee
  4. dart参数传方法_Dart语法
  5. 一个普通程序员的财务自由之路
  6. 查看服务器用户所占空间
  7. 第九头驴的故事--不要忘了自己是谁
  8. C# VS2019 Runtime Error! R6034:C runtime library incorrectly
  9. COleVariant 和 CTime
  10. Kotlin专题「二」:变量(var与val)、常量、注释