POJ 3613 floyd+矩阵快速幂
2016-07-17 20:41
323 查看
题意:
求s到e恰好经过n边的最短路
思路:
这题已经被我放了好长时间了。
原来是不会矩阵乘法,快速幂什么的也一知半解
现在终于稍微明白了点了
其实就是把矩阵乘法稍微改改 改成能够满足结合律的矩阵“加法”,也就是floyd的步骤。
我就直接把集训队论文放上来吧。。。。(证明它满足结合率的,,,现在我看着还是懵逼的) 希望以后回头看的时候能够看懂吧
注意这里初始化的时候自己到自己的权值不能赋成零。。因为这个WA了一会儿
// by SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int c[1000050],cnt=0; int n,t,s,e,xx,yy,zz; struct matrix{ int a[205][205]; void init(){memset(a,0x3f,sizeof(a));} }map,cpy; matrix add(matrix &a,matrix &b){ matrix jy;jy.init(); for(int i=1;i<=cnt;i++) for(int j=1;j<=cnt;j++) for(int k=1;k<=cnt;k++) jy.a[i][j]=min(a.a[i][k]+b.a[k][j],jy.a[i][j]); return jy; } void pow(matrix &ans,int x){ while(x){ if(x&1)ans=add(ans,cpy); cpy=add(cpy,cpy); x>>=1; } printf("%d\n",ans.a[c[s]][c[e]]); } int main(){ map.init(); scanf("%d%d%d%d",&n,&t,&s,&e); for(int i=1;i<=t;i++){ scanf("%d%d%d",&zz,&xx,&yy); if(!c[xx])c[xx]=++cnt; if(!c[yy])c[yy]=++cnt; map.a[c[xx]][c[yy]]=map.a[c[yy]][c[xx]]=zz; } for(int i=1;i<=cnt;i++) for(int j=1;j<=cnt;j++) cpy.a[i][j]=map.a[i][j]; pow(map,n-1); }
相关文章推荐
- Spring中基于Java的配置@Configuration和@Bean用法
- 结构体练习题
- Android-对相册中的图片进行上传或下载
- 《leetCode》:Sliding Window Maximum
- VideoView-全屏播放
- 进程关系
- hdu 1864
- 欢迎使用CSDN-markdown编辑器
- vector相关函数简介
- HTML 5的革新——语义化标签(一)
- ReentrantLock使用场景以及注意事项
- TestNG开源插件Arrow介绍
- swift计算型属性与懒加载的对比
- 字符编码简明教程
- 求1+2+3+...+n java
- 如何阻止Android的反编译apk
- 【计算机算法】几种常见排序算法
- flex布局 与 iconfont
- Android-自定义手势识别-复杂手势识别
- JAVA网络编程