1 //20142880 唐炳辉 石家庄铁道大学
  2 #include<iostream>
  3 #include<string>
  4 using namespace std;
  5 #define Maxnum 32767
  6 #define N 100
  7
  8
  9
 10 typedef struct
 11 {
 12     string Dianarr[N];
 13     string info[N];
 14     int arcs[N][N];
 15     int DianNum,BianNum;
 16 }FloydStruct;
 17
 18 int LocateVex(FloydStruct G, string a)
 19 {
 20     int i;
 21     bool flag = 0;
 22     for(i = 0;i < G.DianNum;i++)
 23         if(a == G.Dianarr[i])
 24         {
 25             flag = 1;
 26             return i;
 27         }
 28     if(flag == 0)
 29     {
 30         return -1;
 31     }
 32 }
 33 void CreateUDN(FloydStruct &G)
 34 {
 35     cout << "请输入顶点数和边数:" << endl;
 36     cin >> G.DianNum >> G.BianNum;
 37     cout << "请输入顶点信息:"  << endl;
 38     for(int i = 0;i<G.DianNum;i++)
 39         cin >> G.Dianarr[i];
 40     for(int i = 0;i<G.DianNum;i++)
 41         for(int j = 0;j<G.DianNum;j++)
 42             G.arcs[i][j] = Maxnum;
 43     string v1,v2;
 44     int w,i,j;
 45     cout << "请输入存在路径的两个顶点和路径长度:" << endl;
 46     for(int k = 0;k<G.BianNum;k++)
 47     {
 48         cin >> v1 >> v2 >> w;
 49         i = LocateVex(G,v1);//获取点的数组下标
 50         j = LocateVex(G,v2);
 51         G.arcs[i][j] = w;//权值赋值给两点
 52     }
 53 }
 54
 55
 56 int Path[N][N];
 57 int D[N][N];
 58 void Floyd(FloydStruct G)    //佛洛依德
 59 {
 60     for(int i = 0;i < G.DianNum;i++)
 61         for(int j  = 0; j < G.DianNum;j++)
 62         {
 63             D[i][j] = G.arcs[i][j];
 64             if(D[i][j]<Maxnum)
 65                 Path[i][j] = i;
 66             else
 67                 Path[i][j] = -1;
 68         }
 69     for(int k = 0;k < G.DianNum;k++)/**核心**/
 70         for(int i  = 0; i < G.DianNum;i++)
 71             for(int j  = 0; j < G.DianNum;j++)
 72                 if(D[i][k] + D[k][j] < D[i][j])
 73                 {
 74                     D[i][j] = D[i][k] + D[k][j];
 75                     Path[i][j] = Path[k][j];
 76                 }
 77 }
 78
 79 void printFl(FloydStruct G)            //输出
 80 {
 81     /*string a,b;
 82     int i,j,font = 1;
 83     cout << "请输入当前位置和要去位置:" << endl;
 84     cin >> a >> b;
 85     //显示最短路径
 86
 87
 88     i = LocateVex(G,a);
 89     j = LocateVex(G,b);
 90     if(D[i][j]==Maxnum)
 91          cout << "最短距离为:" << "不可达!"<< endl;
 92     else
 93         cout << "最短距离为:" << D[i][j]<< endl;*/
 94   for(int i=0;i<G.DianNum;i++)
 95     {
 96         for(int j=i+1;j<G.DianNum;j++)
 97         {
 98
 99
100
101             if(D[i][j]!=Maxnum)
102             {int q =0;
103
104             int j1=j;
105                 int a[20]={100};
106                 while(1)
107                 {
108
109                     if(Path[i][j1]!=i)
110                     {
111
112
113                     a[q]=j1=Path[i][j1];
114
115                     q=q++;
116
117
118                     }
119                     else
120                     {
121                     break;}
122                 }
123
124                 cout<<G.Dianarr[i]<<"------>";
125                 for(int p=q-1;p>=0;p--)
126                 {
127                     cout<<G.Dianarr[a[p]]<<"------>";
128                 }
129                     cout<<G.Dianarr[j]<< D[i][j]<< endl;
130             }
131         }
132
133     }
134  //temp终点
135
136 }
137
138 void main()
139 {
140     FloydStruct G;
141     CreateUDN(G);//生成邻接矩阵
142     Floyd(G);
143     printFl(G);
144 }

转载于:https://www.cnblogs.com/sanzangtdashi/p/5647426.html

佛洛依德 c++ 最短路径算法相关推荐

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

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

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

    佛洛依德算法求最短路径实例 #include <iostream> #include <string.h> #include <stdlib.h> #include ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. mybatisplus逻辑删除
  2. yolov4负样本_了解各种挂件--帮助读懂YOLOV4
  3. 【Git学习笔记6】把当前工作现场“储藏”起来:stash操作
  4. Jquery Mobile 百度地图 Demo
  5. leetcode 16. 3Sum Closest | 16. 最接近的三数之和(双指针)
  6. RDD基本转换操作:zipWithIndex、zipWithUniqueId
  7. 钉钉api 获取 accesstoken_Thinkphp5.X异常接管后通过钉钉机器人推送通知
  8. 呷哺呷哺:预期2021年净亏损约2.75亿元至2.95亿元
  9. “拒绝访问”协助方案
  10. C语言中的字符串函数
  11. pku 1325 Machine Schedule(匈牙利算法)
  12. Coolite中的ComboBox控件示例
  13. 申请手册:英国百所大学中文名称及网址
  14. DeepFM 参数理解(二)
  15. [图论]最大流问题(Maximum flow)的定义
  16. Linux操作系统普通用户与root之间的切换
  17. vue3 自定义指令 directive
  18. 【文件包含漏洞-03】文件包含漏洞的利用及如何利用本地文件包含漏洞GetShell
  19. 2019中国脑科学与神经调控技术发展高峰论坛
  20. linux系统配置交换机指令,【001】H3C交换机命令使用介绍

热门文章

  1. php 图片圆角透明,CSS_使用CSS3实现圆角,阴影,透明,CSS实现圆角,阴影,透明的方法 - phpStudy...
  2. C# DataGridView如何获取选中行的某个数据
  3. 奉贤区企业技术中心认定给予40万元财政支持
  4. Visio 绘图完如何弄到word中调整位置
  5. c#net无法将文件 复制到 对路径访问被拒绝或源文件 未能打开(未指定的错误)
  6. ElasticSearch的search.max_buckets值1000限制问题
  7. Outlook Express 收件箱修复
  8. php生成分站,利用thinkphp开发搭建自己的城市分站站群
  9. 踩坑:preventDefault
  10. HTML5+CSS大作业——丝绸之路网页设计(6页)