矩阵乘法求最短路
来源:互联网 发布: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*/
- 矩阵乘法求最短路
- hdu2807之矩阵乘法+最短路
- [矩阵乘法][最短路]无奈的学长
- C++ 求矩阵最短路问题最简单最暴力的dp解法
- 【BZOJ1706】[usaco2007 Nov]relays 奶牛接力跑【DP】【矩阵乘法】【限制最短路】
- 【弱校胡策】2016.4.14 (bzoj2164)最短路+状压DP+矩阵乘法+高斯消元+树链剖分+线段树+背包DP
- [NOIP模拟][LIS][数列映射][最短路][数论+图论][矩阵乘法][容斥原理]
- Dijkstra 求最短路
- Dijkstra 求最短路
- hdu2544最短路 Floyd求最短路
- HDU2544最短路 (Dijkstra求最短路)
- Strassen方法求矩阵乘法
- 矩阵 模板(矩阵加减,矩阵乘法,矩阵求逆)
- HDU 1217 Arbitrage 乘法最短路
- Dijkstra求最短路与次短路
- A*搜索求最短路
- POJ1511_Invitation_Cards_SPFA算法求最短路
- poj1062 Dijkstra 求最短路
- Fisher线性判别
- 如何将word2010里的奇怪的段落换行符正常显示
- Java-数组
- recently
- 找到一个子字符串在母字符串中的位置
- 矩阵乘法求最短路
- fastcall调用约定详解(VC与Delphi)
- GBA反汇编(烈火之剑<中文版>查找字库)
- linux 环境下修改ip地址(设置静态IP)
- Http Get Post put delete
- 10大最适合编程的字体推荐
- [iOS] enable loading js cache
- github的基本使用
- hdu 1287 破译密码