每对顶点间最短路径;Floyd算法;写的很乱,判断太多了;没有用动态规划过程中构建路径;用O(n三次方)时间构造路径;
2010-04-05 12:38
453 查看
#include <iostream> using namespace std; #define NoEdge 1000 typedef struct { char *vertices;//图的顶点 int num;//顶点数量 int **edge;//边的权值 }Graph; class Floyd { private: int **dist;//最短路径权值和 int **path;//最短路径的前驱顶点 Graph graph;//邻接矩阵图 public: Floyd(int num) { graph.num=num; dist=new int* [num+1]; path=new int* [num+1]; graph.edge=new int* [num+1]; graph.vertices=new char [num+1]; for(int i=0;i<=num;i++) { dist[i]=new int [num+1]; path[i]=new int [num+1]; graph.edge[i]=new int [num+1]; } } void input() { for(int i=1;i<=graph.num;i++) { cin>>graph.vertices[i]; } for(int i=1;i<=graph.num;i++) { for(int j=i+1;j<=graph.num;j++) { cout<<graph.vertices[i]<<","<<graph.vertices[j]<<endl; cin>>graph.edge[i][j]; cout<<graph.vertices[j]<<","<<graph.vertices[i]<<endl; cin>>graph.edge[j][i]; } } } void floyd() { for(int i=1;i<=graph.num;i++) { for(int j=1;j<=graph.num;j++) { if(i!=j) { dist[i][j]=graph.edge[i][j]; } else { dist[i][j]=0; } } } for(int k=1;k<=graph.num;k++) { for(int i=1;i<=graph.num;i++) { for(int j=1;j<=graph.num;j++) { if(i!=k&&j!=k&&i!=j) { if(dist[k][j]==NoEdge||dist[i][k]==NoEdge) { dist[i][j]=dist[i][j]; } else { dist[i][j]=dist[i][j]<=dist[i][k]+dist[k][j]? dist[i][j]:dist[i][k]+dist[k][j]; } } } } } } void getPath() { for(int i=1;i<=graph.num;i++) { for(int j=1;j<=graph.num;j++) { if(dist[i][j]==NoEdge) { path[i][j]=-1; } else { for(int k=1;k<=graph.num;k++) { if(j!=k) { if(dist[i][k]+graph.edge[k][j]==dist[i][j]) { path[i][j]=k; } } } } } } } void printPath(int i,int j) { if(dist[i][j]==NoEdge) { exit(-1); } if(i==j) { cout<<graph.vertices[i]<<" "; return; } printPath(i,path[i][j]); cout<<graph.vertices[j]<<" "; } }; void main() { Floyd test(6); test.input(); test.floyd(); test.getPath(); test.printPath(6,1); }
相关文章推荐
- 动态规划、最短路径、Floyd算法
- 动态规划之DP中判断是否到达某一状态(最短时间是什么)?
- 动态规划之所有点对的最短路径问题(Floyd算法)
- 动态规划在求解全源最短路径中的应用(JAVA)--Floyd算法
- 动态规划 之最短路径问题
- 求有向网中任意一对顶点之间的最短路径 Floyd算法
- 每对顶点间的最短路径——Floyd算法
- 动态规划 最短路径
- 第十三周 每对顶点之间的最短路径(Floyd算法)
- POJ-Stockbroker Grapevine-Floyd算法-每一对顶点间最短路径-动态规划
- 动态规划矩形嵌套及DAG上的最短路径。
- Floyd算法求解每一对顶点之间的最短路径2
- 每对顶点间的最短路径算法时间复杂度改进C++实现
- UVa 1025 (DAG 上的动态规划,有固定终点的最短时间,逆推法)
- 动态规划解决分层图最短路径问题
- 所有顶点之间的最短路径——Floyd算法
- 经典算法之Floyd算法(求图中任意一对顶点间的最短路径)
- 动态规划题——最短路径问题
- 动态规划之Dijkstra算法求最短路径
- 第十二周——项目一—最短路径(4)Floyd算法验证(每对顶点之间的最短路径)