hdu 2807 The Shortest Path 优化矩阵运算+floyd
2016-04-05 22:02
621 查看
题目链接
题意:给出n个城市,每个城市为一个m阶矩阵。若存在矩阵B使矩阵A*B==C,那么城市A到C有一条路径为1的路。求两个城市之间的最短路。
这题貌似一般的暴力过不了,需要用到矩阵乘法的优化。由于这题的数据量很小,判断出两个城市之间的路径后用Floyd就可以轻松求解。
矩阵相乘优化算法实现讲解:传送门。
这题要注意A,B,C之间都不相等,否则wa。
题意:给出n个城市,每个城市为一个m阶矩阵。若存在矩阵B使矩阵A*B==C,那么城市A到C有一条路径为1的路。求两个城市之间的最短路。
这题貌似一般的暴力过不了,需要用到矩阵乘法的优化。由于这题的数据量很小,判断出两个城市之间的路径后用Floyd就可以轻松求解。
矩阵相乘优化算法实现讲解:传送门。
这题要注意A,B,C之间都不相等,否则wa。
#include <iostream> #include<cstdio> #include<cstring> #include<cmath> #define N 85 #define INF 0x7ffffff using namespace std; int mx ,mp ,n,m; void matrix(int u,int v) { int t ={0}; for(int i=0;i<m;i++) for(int k=0;k<m;k++) if(mx[u][i][k]) for(int j=0;j<m;j++) t[i][j]+=mx[u][i][k]*mx[v][k][j]; for(int i=0;i<n;i++) { int flag=1; if(i==u||i==v) continue; for(int j=0;j<m&&flag;j++) for(int k=0;k<m&&flag;k++) if(mx[i][j][k]!=t[j][k]) flag=0; if(flag) mp[u][i]=1; } } void floyd() { for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); } int main() { while(~scanf("%d%d",&n,&m)&&(n||m)) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) for(int k=0;k<m;k++) scanf("%d",&mx[i][j][k]); for(int i=0;i<n;i++) for(int j=0;j<n;j++) mp[i][j]=INF; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(i!=j) matrix(i,j); floyd(); int k; cin>>k; for(int i=0;i<k;i++) { int u,v; scanf("%d%d",&u,&v); if(mp[u-1][v-1]>=INF) cout<<"Sorry"<<endl; else cout<<mp[u-1][v-1]<<endl; } } }
相关文章推荐
- 深度学习之Softmax回归
- 使用Nginx+FFMPEG搭建HLS直播转码服务器
- 虚析构函数 和 纯虚析构函数
- 简单的投票页面,只有一个html页面
- spring原理
- windows客户端开发--判断一个文件夹中是否存在文件夹
- LeetCode之9---Palindrome Number
- 【HNOI模拟By lyp】Day1
- 为什么总连不上--之在Linux系统下使用CLI连接Microsoft Azure 21V版本
- PHPcms首页幻灯片调用代码
- 图的邻接矩阵表示
- 图的邻接矩阵表示
- 密码学应用(DES,AES, MD5, SHA1, RSA, Salt, Pkcs8)
- UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
- 协方差
- 使用dubbo+zookeeper创建一个小应用
- 为什么我要成为最佳(一)
- C++虚函数表详细解释及实例分析
- 数据库
- session 学习