邻接矩阵计算节点对最短路径
2014-05-29 12:03
441 查看
#include <iostream> #include <limits> using namespace std; void extend_shortest_paths(int **matrix,int **W,int **result,int n)//计算最短路径 { for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ int min=numeric_limits<int>::max();//保存最小值 for(int k=0;k<n;++k){ if(matrix[i][k]!=numeric_limits<int>::max() && W[k][j]!=numeric_limits<int>::max()){ if(min>matrix[i][k]+W[k][j]){ min=matrix[i][k]+W[k][j]; } } } result[i][j]=min; } } } int ** faster_all_pairs_shortest_paths(int **matrix,int n)//重复平方技术计算所有结点对的最短路径 { int **result=new int * ; for(int i=0;i<n;++i){ result[i]=new int ; } int **data=new int * ; for(int i=0;i<n;++i){ data[i]=new int ; for(int j=0;j<n;++j){ data[i][j]=matrix[i][j]; } } int **mat; int m=1; while(m<n-1){ mat=data; extend_shortest_paths(mat,mat,result,n); for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ data[i][j]=result[i][j]; } } m*=2; } for(int i=0;i<n;++i){ delete [] data[i]; } delete [] data; return result; } int ** slow_all_pairs_shortest_paths(int **matrix,int n)//一步一步计算 { int **result=new int * ; for(int i=0;i<n;++i){ result[i]=new int ; } int **data=new int * ; for(int i=0;i<n;++i){ data[i]=new int ; for(int j=0;j<n;++j){ data[i][j]=matrix[i][j]; } } int **mat; for(int i=0;i<n-2;++i){ mat=data; extend_shortest_paths(mat,matrix,result,n); for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ data[i][j]=result[i][j]; cout<<data[i][j]<<"\t"; } cout<<endl; } cout<<endl; } for(int i=0;i<n;++i){ delete [] data[i]; } delete [] data; return result; } int ** print_precede_matrix(int **result,int **org,int n)//计算前驱子图 { int **pre_matrix=new int * ; for(int i=0;i<n;++i){ pre_matrix[i]=new int ; pre_matrix[i][i]=i; } for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ if(i!=j){ for(int k=0;k<n;++k){ if(org[k][j]!=numeric_limits<int>::max() && k!=j){//判断在原始矩阵中结点k到结点j是否连通 if(result[i][j]==result[i][k]+result[k][j]){ pre_matrix[i][j]=k; } } } } } } return pre_matrix; } void print_short_paths(int **pre_matrix,int i,int j) { if(i!=j){ print_short_paths(pre_matrix,i,pre_matrix[i][j]); cout<<pre_matrix[i][j]<<"\t"; } } void print(int **result,int **pre_matrix,int n) { for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ if(i!=j){ cout<<"from node "<<i<<" to "<<j<<" : "; if(result[i][j]!=numeric_limits<int>::max()){ print_short_paths(pre_matrix,i,j); cout<<j; }else{ cout<<"no paths exist"; } cout<<endl; } } } } int main() { int max=numeric_limits<int>::max();//最大值 int matrix[5][5]={0,3,8,max,-4,//邻接矩阵表示图 max,0,max,1,7, max,4,0,max,max, 2,max,-5,0,max, max,max,max,6,0}; //int matrix[6][6]={0,max,max,max,-1,max,//邻接矩阵表示图 // 1,0,max,2,max,max, // max,2,0,max,max,-8, // -4,max,max,0,3,max, // max,7,max,max,0,max, // max,5,10,max,max,0}; int n=5; int **mat=new int * ; for(int i=0;i<n;++i){ mat[i]=new int ; for(int j=0;j<n;++j){ mat[i][j]=matrix[i][j]; } } int **result=faster_all_pairs_shortest_paths(mat,n);//计算机结点间最短路径 for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ cout<<result[i][j]<<"\t"; } cout<<endl; } cout<<endl; int **pre_matrix=print_precede_matrix(result,mat,n);//计算前驱矩阵 for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ cout<<pre_matrix[i][j]<<"\t"; } cout<<endl; } cout<<endl; print(result,pre_matrix,n); for(int i=0;i<n;++i){ delete [] mat[i]; delete [] result[i]; delete [] pre_matrix[i]; } delete []mat; delete []result; delete []pre_matrix; return 0; }
相关文章推荐
- (阶段三 dijkstra算法温习1.1)HDU 2544 最短路(利用dijkstra算法计算两个节点间的最短路径)
- 算法设计与分析——使用dijkstra算法计算最短路径并且给出路径上的节点序列
- 邻接矩阵计算最短路径问题的几个发现
- 求利用邻接矩阵求多有节点最短路径的java程序 可运行
- Matlab计算最短路径及路径的个数
- 二叉树系列——二叉树中任意两个节点之间的最短路径
- (BFS11.1.1)POJ 3126 Prime Path(计算从初始素数到目标素数的最短路径长度)
- 数据结构.图.无向带权&邻接矩阵.最短路径Dijkstra算法
- 基于邻接矩阵存储的图的最短路径问题(Dijkstra算法)
- Dijkstra 算法——计算有权最短路径(边有权值)
- Dijkstra算法(一个节点到其他所有节点的最短路径)
- 利用邻接表求解所有节点的最短路径 java实现 可运行
- poj 3984迷宫问题(bfs求最短路径 类似并查集保存上个节点 保存最短路径)
- Floyd-Warshall 算法-- 最短路径(适合节点密集的图)
- 多叉树-找到X和Y最短路径,打印输长度和节点
- Dijkatra 算法 计算一个点到其他点的最短路径
- 无向图中节点的迭代得到从起始节点到结束节点之间的所有路径,并从中得到最短路径的节点
- poj 2499 计算二叉树的“最短”路径 -> 贪心
- 算法导论笔记:25所有节点对的最短路径问题
- 算法——所有节点对的最短路径:Floyd-Warshall算法、Johnson算法