矩阵乘法求最短路

来源:互联网 发布:iapp源码 编辑:程序博客网 时间:2024/06/04 18:29

算法导论矩阵乘法求最短路,如有错误望大家指出

 

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>using namespace std;#define MAXN 100#define INF 1000000class Mat_Graph{public:Mat_Graph(int num):n(num){memset(Map,0,sizeof(Map));int i,j;for(i=1; i<=n; i++){for(j=1; j<=n; j++){if(i!=j)Map[i][j] = INF;}}}Mat_Graph(Mat_Graph *W){int i,j;n = W->n;for(i=1; i<=n; i++)for(j=1; j<=n; j++){Map[i][j] = W->Map[i][j];}}void AddSingleEdge(int start, int end, int weight=1){Map[start][end] = weight;}void AddDoubleEdge(int a, int b, int weight=1){AddSingleEdge(a,b,weight);AddSingleEdge(b,a,weight);}void DeleteSingleEdge(int start, int end){Map[start][end] = INF;}void DeleteDoubleEdge(int a, int b){DeleteSingleEdge(a,b);DeleteSingleEdge(b,a);}void Print_Edge(){int i,j;for(i=1; i<=n; i++){printf("%d->",i);for(j=1; j<=n; j++){if(Map[i][j]!=0 && Map[i][j]!=INF)printf("->%d",j);}printf("\n");}printf("\n\n");}void Print_Matrix(){int i,j;for(i=1; i<=n; i++){for(j=1; j<=n; j++){printf("%9d ",Map[i][j]);}printf("\n");}printf("\n\n");}int Map[MAXN+4][MAXN+4];int n;//点的数量int m;//边的数量};//附加-》矩阵的乘法Mat_Graph* Matrix_Multiply(Mat_Graph *A, Mat_Graph *B){int n = A->n;int i,j,k;Mat_Graph *C = new Mat_Graph(n);for(i=1; i<=n; i++)for(j=1; j<=n; j++){C->Map[i][j] = 0;for(k=1; k<=n; k++){C->Map[i][j] = C->Map[i][j]+ A->Map[i][k]*B->Map[k][j];}}return C;}//工具函数int min(int a, int b){return b>a ? a:b;}Mat_Graph* Extend_Shortest_Paths(Mat_Graph *L, Mat_Graph *W){int i,j,k;int n = L->n;Mat_Graph *ret = new Mat_Graph(n);for(i=1; i<=n; i++){for(j=1; j<=n; j++){if(i!=j)ret->Map[i][j] = INF;for(k=1; k<=n; k++){if(L->Map[i][k]!=INF && W->Map[k][j]!=INF)  ret->Map[i][j] = min(ret->Map[i][j], L->Map[i][k]+W->Map[k][j]);}}}return ret;}Mat_Graph* Slow_Pairs_Shortest_Paths(Mat_Graph *W){int n = W->n;int m;Mat_Graph *L = new Mat_Graph(W);for(m=2; m<=n-1; m++){L = Extend_Shortest_Paths(L,W);L->Print_Matrix();}return L;}Mat_Graph* Faster_All_Pairs_Shortest_Paths(Mat_Graph *W){int m;int n = W->n;Mat_Graph *L = new Mat_Graph(W);m = 1;while(m<n-1){L = Extend_Shortest_Paths(L,L);m = 2*m;L->Print_Matrix();}return L;}#define UNSUBMITint main(){#ifdef UNSUBMITfreopen("data.in","r",stdin);#endifint n,m;int start,end,weight;cin>>n>>m;//输入要创建的图的点数和边数Mat_Graph *G = new Mat_Graph(n);while(m){cin>>start>>end>>weight;G->AddSingleEdge(start, end, weight);m--;}G->Print_Edge();Mat_Graph *result = Slow_Pairs_Shortest_Paths(G);result->Print_Matrix();printf("\n\n\n");result = Faster_All_Pairs_Shortest_Paths(G);result->Print_Matrix();return 0;}//数据-》图25.2/*6 101 5 -12 1 12 4 23 2 23 6 -84 1 -44 5 35 2 76 2 56 3 10*/


 

原创粉丝点击