Shortest paths and matrix multiplication
来源:互联网 发布:热血传奇手游源码架设 编辑:程序博客网 时间:2024/06/05 22:37
本算法是对<算法导论>第25章第一节的实现
有三个版本:
第一个,普通版本:
//SLOW-ALL-PAIRS-SHORTEST-PATHS#include<iostream>using namespace std;#define MAX 32767int N,M;int u,v,l;int W[1000][1000],Q[1000][1000],tmp[1000][1000];void print(){for(int i=0;i<N;++i){for(int j=0;j<N;++j)cout<<Q[i][j]<<"\t";cout<<endl;}}bool ExtendShortestPath(){bool sign=true;for(int i=0;i<N;++i){for(int j=0;j<N;++j){for(int k=0;k<N;++k){if(Q[i][k]<MAX&&W[k][j]<MAX){if(Q[i][j]>Q[i][k]+W[k][j]){sign=false;tmp[i][j]=Q[i][k]+W[k][j];}}}}}for(int i=0;i<N;++i)for(int j=0;j<N;++j)Q[i][j]=tmp[i][j];return sign;}void SlowAllPairShortestPath(){bool getShortest=false;while(!getShortest){getShortest=ExtendShortestPath();}}int main(){cin>>N>>M;for(int i=0;i<N;++i){for(int j=0;j<N;++j){W[i][j]=Q[i][j]=tmp[i][j]=MAX;}W[i][i]=Q[i][i]=tmp[i][i]=0;}for(int i=0;i<M;++i){cin>>u>>v>>l;W[u-1][v-1]=Q[u-1][v-1]=tmp[u-1][v-1]=l;}SlowAllPairShortestPath();print();return 0;}
第二个,高级一点,用到了指针交换技术:<pre name="code" class="html">//SLOW-ALL-PAIRS-SHORTEST-PATHS#include<iostream>#include<fstream>#include<algorithm>using namespace std;#define MAX 32767ifstream fin("data.in");int N,M;int u,v,l;int W[1000][1000],Q[1000][1000],tmp[1000][1000];void print(){for(int i=0;i<N;++i){for(int j=0;j<N;++j)cout<<Q[i][j]<<"\t";cout<<endl;}}bool ExtendShortestPath(){bool sign=true;for(int i=0;i<N;++i){for(int j=0;j<N;++j){for(int k=0;k<N;++k){if(Q[i][j]>Q[i][k]+W[k][j]){sign=false;tmp[i][j]=Q[i][k]+W[k][j];}elsetmp[i][j]=(tmp[i][j]<Q[i][j])?tmp[i][j]:Q[i][j];}}}swap(Q,tmp);return sign;}void SlowAllPairShortestPath(){bool getShortest=false;while(!getShortest){getShortest=ExtendShortestPath();}}int main(){cin>>N>>M;for(int i=0;i<N;++i){for(int j=0;j<N;++j){W[i][j]=Q[i][j]=tmp[i][j]=MAX;}W[i][i]=Q[i][i]=tmp[i][i]=0;}for(int i=0;i<M;++i){cin>>u>>v>>l;W[u-1][v-1]=Q[u-1][v-1]=tmp[u-1][v-1]=l;}SlowAllPairShortestPath();print();return 0;}
第三个,是另外一个版本:
这个只贴核心代码了
bool ExtendShortestPath(){bool sign=true;for(int i=0;i<N;++i){for(int j=0;j<N;++j){for(int k=0;k<N;++k){if(L[i][j]>L[i][k]+L[k][j]){sign=false;tmp[i][j]=L[i][k]+L[k][j];}elsetmp[i][j]=(tmp[i][j]<=L[i][j])?tmp[i][j]:L[i][j];}}}swap(L,tmp);return sign;}void FastAllPairShortestPath(){bool getShortest=false;while(!getShortest){getShortest=ExtendShortestPath();}}
这是算法导论上面伪代码的实现.P622
0 0
- Shortest paths and matrix multiplication
- Lesson 7 Matrix-matrix and matrix-vector multiplication
- Matrix Multiplication
- Matrix Multiplication
- Matrix Multiplication
- Matrix Multiplication
- Matrix multiplication
- Matrix multiplication
- The Program of Algorithms ------- Diveide and Conquer ---- Matrix Multiplication
- (Shortest Paths Algorithm)
- Double Shortest Paths CSU
- Matrix Chain Multiplication
- zoj1094 Matrix Chain Multiplication
- Matrix chain multiplication problem
- POJ 3318 Matrix Multiplication
- Matrix Chain Multiplication
- uva442 Matrix Chain Multiplication
- 3712. Matrix multiplication
- HTTP报文基本结构,自己写程序发送http包登陆某些网站。
- UVA 10304 dp的四边形不等式优化
- Unity之EditorGUILayout-Layer、Mask、Tag
- 面试题22:栈的压入、弹出队列
- 视频传输播放为解决的bug--续2(已解决)
- Shortest paths and matrix multiplication
- Android中横竖屏切换时生命周期变化详解
- Linux命令记录
- 第二十三章 多项目集中权限管理及分布式会话——《跟我学Shiro》
- sql server2008 插入行时报错:单元格的值无效
- 希望这不是未来的你
- 安装python
- python中的__call__特殊函数
- Ubuntu上编译安装PostgreSQL