佛洛依德算法求最短路径实例
佛洛依德算法求最短路径实例
#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;
}
运行程序后显示的界面
插入数据
演示其中一个功能
佛洛依德算法求最短路径实例相关推荐
- 佛洛依德算法求最短路径(记录路径信息)
佛洛依德算法: 利用D矩阵拿到邻接矩阵中的权值.path矩阵记录两点之间的移动中转点(初始值为起点). 对于邻接矩阵中 i 到 j 点的权值进行比较,若加上一个中转点 k 后的权值小于原本的权值,则对 ...
- 佛洛依德算法求各个结点到各个结点的最短路径
package Algorithm;import java.util.Arrays;public class Floyd {public static void main(String[] args) ...
- 推免复习之数据结构与算法 佛洛依德算法
佛洛依德算法算法作为一个经典的求最短路径的算法,思路其实很简单,就是不停地进行"松弛操作",直到全部遍历一遍.那么什么是松弛操作呢?比如说我们的图存在一个邻接矩阵graph中,gr ...
- 最短路径算法之迪杰斯特拉算法(Dijkstra)和佛洛依德算法(Floyd)
今天学习了这两种算法,都是用来求最小路径的算法,但是迪杰斯特拉算法只能从某个特定点到所有点的最短路径,而佛洛依德算法可以查出任意点到任意点的最小路径. 迪杰斯特拉: package dijkstra; ...
- 十大常用算法之佛洛依德算法
十大常用算法的完整实现 一.二分查找算法:https://blog.csdn.net/weixin_46635575/article/details/121532149 二.分治算法:https:// ...
- 迪杰斯特拉算法与佛洛依德算法
迪杰斯特拉算法用于计算:某点v0到其他所有点的最短路径,时间复杂度为O(n^2) 初态: 设定V为所有顶点的集合. 设定S为已经得到的最短路径的顶点vi的集合.即S中的顶点vi,都是已经确定下来v0到 ...
- Java实现佛洛依德算法(floyd)的完整代码
Java实现佛洛依德算法(floyd)的完整代码 /*** 弗洛伊德(floyd)算法求图中所有点对之间的最短路径:* 其中'-1'表示两点之间目前还没有联通的路径:* 结论:如果A点到G点之间有最短 ...
- 佛洛依德算法C语言简单实现
计算图中每个顶点间的最短路径及路径长度 采用邻接矩阵表示图 代码如下: #include <stdio.h> #include <windows.h> #include < ...
- 佛洛依德算法的学习与实现
1.问题引入 带权有向图中单源点的最短路径问题可以用地杰斯特拉算法求解,如果要求解图中每一对顶点之间的最短路径,类似可以想到的方法为:每次以一个顶点为源点,重复执行地杰斯特拉算法算法n次,这样,便可以 ...
最新文章
- 【BZOJ 3879】SvT
- 读张鸣-《辛亥:摇晃的中国》感
- 【C/C++】main函数之参数argc和argv含义及用法
- 20天掌握C语言,C语言零基础到项目实战,玩转C语言
- 如何帮助金融客户“用好云”?
- mvc 扫描jar jsp_SpringBoot+jsp项目启动出现404
- 使用VS2010+OpenCV2.4.9简单图像水印代码
- qt程序部署在linux,Qt应用打包发布,部署真正的Qt程序LinuxWindows-Go语言中文社区...
- e5 2630v4 php性能,至强E5 V4性能表现测试
- 第6章—渲染web视图—使用Thymeleaf
- 天勤数据结构代码——树基本操作
- 全国市场调查大赛经验分享(二)
- 看到强烈的太阳光你会不由自主的打喷嚏吗?
- 【扩展作业分享】JAVA, 数据结构与算法, 操作系统,大数据可视化,游戏制作
- K210使用MaixPy IDE长时间显示连接中的解决方案
- 【转】实习中,我怎样学习和工作
- JAVA通过Hutool解析CSV文件【导入即用,无需封装】
- 从MUD到MMO——虚拟世界发展简史以及未来可能性的杂谈
- 中文信息处理——纵览与建议
- Spring3.0.5源码扩展支持AOP 获取HttpServletResponse
热门文章
- 【FPGA教程案例100】深度学习1——基于CNN卷积神经网络的手写数字识别纯Verilog实现,使用mnist手写数字数据库
- Open3d 曲面滤波
- 一文带你了解 ZigBee
- dart参数传方法_Dart语法
- 一个普通程序员的财务自由之路
- 查看服务器用户所占空间
- 第九头驴的故事--不要忘了自己是谁
- C# VS2019 Runtime Error! R6034:C runtime library incorrectly
- COleVariant 和 CTime
- Kotlin专题「二」:变量(var与val)、常量、注释