Floyd算法求最短路径
来源:互联网 发布:易语言自动按键源码 编辑:程序博客网 时间:2024/05/01 19:28
http://blog.csdn.net/hackerain/article/details/6055946
#define MAX_VERTEX_NUM 20#define MAX 1000000000typedef struct{std::string vexs[MAX_VERTEX_NUM];int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];int vertexnum,edgenum;}MGraph;void createDN_AM(MGraph &G,int n,int e){G.vertexnum=n;G.edgenum=e;int i,j,k;int weight;for(i=0;i<n;i++){cin>>G.vexs[i];}for(i=0;i<n;i++)for(j=0;j<n;j++){if(i==j)G.edges[i][j]=0;elseG.edges[i][j]=MAX;}for(k=0;k<e;k++){cin>>i>>j>>weight;G.edges[i][j]=weight;}}void ShortestPath_Floyd(MGraph &G){int i,j,k;int dist[MAX_VERTEX_NUM][MAX_VERTEX_NUM];std::string path[2*MAX_VERTEX_NUM][2*MAX_VERTEX_NUM];for(i=0;i<G.vertexnum;i++)for(j=0;j<G.vertexnum;j++){dist[i][j]=G.edges[i][j];if(dist[i][j]<MAX){path[i][j]=G.vexs[i]+G.vexs[j];}elsepath[i][j]="";}for(k=0;k<G.vertexnum;k++)for(i=0;i<G.vertexnum;i++)for(j=0;j<G.vertexnum;j++)if(dist[i][k]+dist[k][j]<dist[i][j]){dist[i][j]=dist[i][k]+dist[k][j];path[i][j]=path[i][k]+path[k][j];}for(i=0;i<G.vertexnum;i++){for(j=0;j<G.vertexnum;j++)cout<<path[i][j]<<" "<<dist[i][j]<<" ";cout<<endl;}}int main(){MGraph G;createDN_AM(G,7,8);ShortestPath_Floyd(G);return 0;}
原文:
01.#include<iostream> 02.#include<string> 03.using namespace std; 04./*邻接矩阵的类型定义*/ 05.#define MAX 10000000 06.#define MAX_VERTEX_NUM 20 07.typedef struct 08.{ 09. string vexs[MAX_VERTEX_NUM];//用一维数组存储顶点信息 10. int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//用二维数组充当矩阵,来存储顶点边的信息 11. int vexnum,edgenum;//顶点树和边数 12.}MGraph; 13./*构造有向网的邻接矩阵*/ 14.void CreateDN_AM(MGraph &G,int n,int e) 15.{ 16. G.vexnum=n; 17. G.edgenum=e; 18. 19. int i,j,k; 20. int weight; 21. for(i=0;i<n;i++) 22. cin>>G.vexs[i];//输入顶点信息 23. for(i=0;i<n;i++) 24. for(j=0;j<n;j++) 25. { 26. if(i==j) 27. G.edges[i][j]=0;//主对角线上的权值为0 28. else 29. G.edges[i][j]=MAX;//将矩阵初始化为MAX 30. } 31. for(k=0;k<e;k++) 32. { 33. cin>>i>>j>>weight; 34. G.edges[i][j]=weight; 35. } 36.} 37./*弗洛伊德算法求最短路径*/ 38.void ShortestPath_Floyd(MGraph &G) 39.{ 40. int i,j,k; 41. int dist[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; 42. string path[2*MAX_VERTEX_NUM][2*MAX_VERTEX_NUM]; 43. for(i=0;i<G.vexnum;i++) 44. for(j=0;j<G.vexnum;j++) 45. {//初始化工作 46. dist[i][j]=G.edges[i][j]; 47. if(dist[i][j]<MAX) 48. path[i][j]=G.vexs[i]+G.vexs[j]; 49. else 50. path[i][j]=""; 51. } 52. //三个for循环求最短路径 53. for(k=0;k<G.vexnum;k++) 54. for(i=0;i<G.vexnum;i++) 55. for(j=0;j<G.vexnum;j++) 56. if(dist[i][k]+dist[k][j]<dist[i][j]) 57. { 58. dist[i][j]=dist[i][k]+dist[k][j]; 59. path[i][j]=path[i][k]+path[k][j]; 60. } 61. for(i=0;i<G.vexnum;i++) 62. { 63. for(j=0;j<G.vexnum;j++) 64. cout<<path[i][j]<<" "<<dist[i][j]<<" "; 65. cout<<endl; 66. } 67.} 68.void main() 69.{ 70. freopen("in.txt","r",stdin); 71. MGraph G; 72. CreateDN_AM(G,4,6); 73. ShortestPath_Floyd(G); 74.}
弗洛伊德算法主要是采用了dist二维数组来存储各个顶点之间的最短路径,然后不断更新,它的典型标识是有三个连续的for循环:将每一个顶点插入到另外两个顶点之间,看是否能得到较小的路径,这是它的主要思想,即是所谓的“试探”或是“动态”,其实理解是容易理解的,就是不好表达。
- Floyd算法求最短路径
- Floyd算法求最短路径
- Floyd算法求最短路径并记录路径
- 求最短路径算法之Floyd算法
- Poj 1125 (Floyd算法求最短路径)
- 求最短路径之——Floyd算法
- Floyd算法求最短路径,JAVA实现
- HDU 1874 求最短路径 Floyd 算法
- HDU 1874 求最短路径 Floyd 算法
- [c]HDOJ1874 floyd算法求最短路径
- 多源最短路径floyd算法
- 全源最短路径算法-Floyd
- Floyd算法求多源最短路径
- Floyd 多源最短路径算法
- Floyd算法(记录路径)
- 多源最短路径Floyd算法
- Floyd算法--多源最短路径
- Floyd多源最短路径算法
- ZOJ 1099 HTML
- How to set preferIPv4Stack property for JNLP app?
- 关于JPA
- Java和php中的try-catch分析
- httpclient3 post 方法
- Floyd算法求最短路径
- linux,ar命令详解
- 从下象棋的角度来类比浅析H.264中的像素残差和运动矢量残差
- 整理Android参考学习资料
- 通用权限管理设计 之 数据权限
- Oracle UNION ALL
- Linux,ar,gcc,g++生成库so,a文件
- g++编译warning: deprecated conversion from string constant to ‘char*’ /tmp/ccSf0DmE.o: In function `ma
- javascript 权威指南笔记