佛洛依德 c++ 最短路径算法
2016-07-06 16:54
302 查看
//20142880 唐炳辉 石家庄铁道大学 #include<iostream> #include<string> using namespace std; #define Maxnum 32767 #define N 100 typedef struct { string Dianarr ; string info ; int arcs ; int DianNum,BianNum; }FloydStruct; int LocateVex(FloydStruct G, string a) { int i; bool flag = 0; for(i = 0;i < G.DianNum;i++) if(a == G.Dianarr[i]) { flag = 1; return i; } if(flag == 0) { return -1; } } void CreateUDN(FloydStruct &G) { cout << "请输入顶点数和边数:" << endl; cin >> G.DianNum >> G.BianNum; cout << "请输入顶点信息:" << endl; for(int i = 0;i<G.DianNum;i++) cin >> G.Dianarr[i]; for(int i = 0;i<G.DianNum;i++) for(int j = 0;j<G.DianNum;j++) G.arcs[i][j] = Maxnum; string v1,v2; int w,i,j; cout << "请输入存在路径的两个顶点和路径长度:" << endl; for(int k = 0;k<G.BianNum;k++) { cin >> v1 >> v2 >> w; i = LocateVex(G,v1);//获取点的数组下标 j = LocateVex(G,v2); G.arcs[i][j] = w;//权值赋值给两点 } } int Path ; int D ; void Floyd(FloydStruct G) //佛洛依德 { for(int i = 0;i < G.DianNum;i++) for(int j = 0; j < G.DianNum;j++) { D[i][j] = G.arcs[i][j]; if(D[i][j]<Maxnum) Path[i][j] = i; else Path[i][j] = -1; } for(int k = 0;k < G.DianNum;k++)/**核心**/ for(int i = 0; i < G.DianNum;i++) for(int j = 0; j < G.DianNum;j++) if(D[i][k] + D[k][j] < D[i][j]) { D[i][j] = D[i][k] + D[k][j]; Path[i][j] = Path[k][j]; } } void printFl(FloydStruct G) //输出 { /*string a,b; int i,j,font = 1; cout << "请输入当前位置和要去位置:" << endl; cin >> a >> b; //显示最短路径 i = LocateVex(G,a); j = LocateVex(G,b); if(D[i][j]==Maxnum) cout << "最短距离为:" << "不可达!"<< endl; else cout << "最短距离为:" << D[i][j]<< endl;*/ for(int i=0;i<G.DianNum;i++) { for(int j=i+1;j<G.DianNum;j++) { if(D[i][j]!=Maxnum) {int q =0; int j1=j; int a[20]={100}; while(1) { if(Path[i][j1]!=i) { a[q]=j1=Path[i][j1]; q=q++; } else { break;} } cout<<G.Dianarr[i]<<"------>"; for(int p=q-1;p>=0;p--) { cout<<G.Dianarr[a[p]]<<"------>"; } cout<<G.Dianarr[j]<< D[i][j]<< endl; } } } //temp终点 } void main() { FloydStruct G; CreateUDN(G);//生成邻接矩阵 Floyd(G); printFl(G); }
相关文章推荐
- C++虚函数和纯虚函数
- 简单掌握桶排序算法及C++版的代码实现
- section 1.4 milk3
- 详解Bucket Sort桶排序算法及C++代码实现示例
- C/C++强制类型转换
- C++ 多态
- 深入解析Radix Sort基数排序算法思想及C语言实现示例
- C语言变长数组 struct中char data[0]的用法
- C语言中变量的作用域
- 二叉树二叉链表存储结构 <函数实现:BiTreeFun.cpp>
- C语言实现程序跳转到绝对地址0x100000处执行
- 新的开始--C++征途
- 详解计数排序算法及C语言程序中的实现
- 合并两个有序数组 merging two sorted arrary to make a sorted arrary
- c++面向对象编程(四)--模板
- c++面向对象编程(三)--多态
- lambda在C++中的应用
- 嵌入式程序设计中C/C++代码的优化
- 详解桶排序算法的思路及C++编程中的代码实现
- c++ 控制台弹出文件管理对话框