POJ3613 Cow Relays(矩阵快速幂)
2016-05-17 09:38
323 查看
题目大概要求从起点到终点恰好经过k条边的最短路。
离散数学告诉我们邻接矩阵的k次幂就能得出恰好经过k条路的信息,比如POJ2778。
这题也一样,矩阵的幂运算定义成min,而min满足结合律,所以可以用快速幂求解。
另外这题点的序号要离散化一下,最多也就200个点。
离散数学告诉我们邻接矩阵的k次幂就能得出恰好经过k条路的信息,比如POJ2778。
这题也一样,矩阵的幂运算定义成min,而min满足结合律,所以可以用快速幂求解。
另外这题点的序号要离散化一下,最多也就200个点。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define INF (1<<29) int N; struct Mat{ int m[222][222]; Mat(){ for(int i=0; i<222; ++i){ for(int j=0; j<222; ++j) m[i][j]=INF; } } }; Mat operator*(const Mat &m1,const Mat &m2){ Mat m; for(int i=0; i<N; ++i){ for(int j=0; j<N; ++j){ for(int k=0; k<N; ++k){ m.m[i][j]=min(m.m[i][j],m1.m[i][k]+m2.m[k][j]); } } } return m; }; int idx[1111]; int main(){ Mat m; int n,t,s,e,a,b,c; scanf("%d%d%d%d",&n,&t,&s,&e); memset(idx,-1,sizeof(idx)); while(t--){ scanf("%d%d%d",&c,&a,&b); if(idx[a]==-1){ idx[a]=N++; } if(idx[b]==-1){ idx[b]=N++; } m.m[idx[a]][idx[b]]=m.m[idx[b]][idx[a]]=c; } --n; Mat ans=m; while(n){ if(n&1){ ans=ans*m; } m=m*m; n>>=1; } printf("%d",ans.m[idx[s]][idx[e]]); return 0; }
相关文章推荐
- 测试App组件的集成
- 对象的旅行
- MySQL基础操作汇总
- 实用知识:音乐播放的方法使用
- Linux 下如何安装软件?
- UITextField 的限制输入金额(可为小数的正确金额)
- 用H5实现微信的四个界面
- Oracle V$SESSION详解
- EmguCV学习 与opencv的区别和联系
- 文章标题
- WebSocket学习
- Linux编程之《守护进程》
- Fresco 源码解析 - 利用 @DoNotSkip 来防止混淆
- ArrayList和LinkedList的区别,Hashtable和HashMap类的区别?
- Ubuntu服务器配置成yum源代理服务器
- iOS-本地换肤思路
- 在ASP.NET 2.0中操作数据之五十四:添加新记录时包含一个文件上传选项
- Java -- JavaBean,POJO,VO,DTO的区别和联系
- ”运维离不开安全 安全没有运维也就没有价值“理论下的隐藏意义
- linux基础目录结构