POJ 3613 Cow Relays (floyd + 矩阵高速幂)
题目大意:
求刚好经过K条路的最短路
我们知道假设一个矩阵A[i][j] 表示表示 i-j 是否可达
那么 A*A=B B[i][j] 就表示 i-j 刚好走过两条路的方法数
那么同理
我们把i-j 的路径长度存到A 中。
在A*A的过程中,不断取小的。那么最后得到的也就是i - j 走过两条路的最短路了。
当然也是利用到了floyd的思想。
然后要求出K次的最短路。那么就是矩阵高速幂的工作了。
注意要离散化。用map
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map> using namespace std;
const int N = 101;
map<int,int>mymap;
struct matrix
{
int a[N][N];
}temp,res,origin;
int n;
matrix mul(matrix x,matrix y)
{
memset(temp.a,0x3f,sizeof temp.a);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
temp.a[i][j]=min(temp.a[i][j],x.a[i][k]+y.a[k][j]); return temp;
} matrix matmod(matrix A,int k)
{
memset(res.a,0x3f,sizeof res.a);
for(int i=1;i<=n;i++)res.a[i][i]=0; while(k)
{
if(k&1)res=mul(res,A);
A=mul(A,A);
k>>=1;
}
return res;
}
int main()
{
int k,m,s,e;
while(scanf("%d%d%d%d",&k,&m,&s,&e)!=EOF)
{
memset(origin.a,0x3f,sizeof(origin.a));
mymap.clear();
int num=0;
for(int i=0;i<m;i++)
{
int S,E,LEN;
scanf("%d%d%d",&LEN,&S,&E);
if(!mymap[S])mymap[S]=++num;
if(!mymap[E])mymap[E]=++num;
int l=mymap[S];
int r=mymap[E];
origin.a[l][r]=origin.a[r][l]=LEN;
}
n=num;
matrix ans = matmod(origin,k);
printf("%d\n",ans.a[mymap[s]][mymap[e]]);
}
return 0;
}
POJ 3613 Cow Relays (floyd + 矩阵高速幂)的更多相关文章
- poj 3613 Cow Relays【矩阵快速幂+Floyd】
!:自环也算一条路径 矩阵快速幂,把矩阵乘法的部分替换成Floyd(只用一个点扩张),这样每"乘"一次,就是经过增加一条边的最短路,用矩阵快速幂优化,然后因为边数是100级别的,所 ...
- POJ 3631 Cow Relays Floyd+矩阵快速幂
题目描述 For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race ...
- [POJ3613] Cow Relays(Floyd+矩阵快速幂)
解题报告 感觉这道题gyz大佬以前好像讲过一道差不多的?然鹅我这个蒟蒻发现矩阵快速幂已经全被我还给老师了...又恶补了一遍,真是恶臭啊. 题意 给定一个T(2 <= T <= 100)条边 ...
- poj 3613 Cow Relays(矩阵的图论意义)
题解 用一个矩阵来表示一个图的边的存在性,即矩阵C[i,j]=1表示有一条从i到j的有向边C[i,j]=0表示没有从i到j的边.这个矩阵的k次方后C[i,j]就表示有多少条从i到j恰好经过k条边的路径 ...
- Poj 3613 Cow Relays (图论)
Poj 3613 Cow Relays (图论) 题目大意 给出一个无向图,T条边,给出N,S,E,求S到E经过N条边的最短路径长度 理论上讲就是给了有n条边限制的最短路 solution 最一开始想 ...
- 【floyd+矩阵乘法】POJ 3613 Cow Relays
Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a rel ...
- POJ 3613 [ Cow Relays ] DP,矩阵乘法
解题思路 首先考虑最暴力的做法.对于每一步,我们都可以枚举每一条边,然后更新每两点之间经过\(k\)条边的最短路径.但是这样复杂度无法接受,我们考虑优化. 由于点数较少(其实最多只有\(200\)个点 ...
- poj 3613 Cow Relays
Cow Relays Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5411 Accepted: 2153 Descri ...
- POJ3613 Cow Relays(矩阵快速幂)
题目大概要求从起点到终点恰好经过k条边的最短路. 离散数学告诉我们邻接矩阵的k次幂就能得出恰好经过k条路的信息,比如POJ2778. 这题也一样,矩阵的幂运算定义成min,而min满足结合律,所以可以 ...
随机推荐
- 跟着百度学PHP[14]-初识PDO数据库抽象层
目录: 00x1 php中的pdo是什么? 00x2 pdo创建一个PDO对象 00x1 php中的pdo是什么? 就是操作数据库的方法,pdo就是把操作数据库的函数封装成一个pdo类,其间做了安全验 ...
- hadoop单节点配置
首先按照官网的单机去配置,如果官网不行的话可以参考一下配置,这个是配置成功过的.但是不一定每次都成功 http://hadoop.apache.org/docs/r2.6.5/ centos 6.7 ...
- Yii2 Api认证和授权(翻译)
Authentication 认证 RESTful Api 是无状态的, 因此这意味着不能使用 sessions && cookies. 因此每一个请求应该带有一些 authentic ...
- [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)
Could not fetch URL https://pypi.python.org/simple/six/: There was a problem confirming the ssl cert ...
- JobTracker作业调度分析
转自:http://blog.csdn.net/Androidlushangderen/article/details/41408517 JobTracker的作业调度给我感觉就是比较宏观意义上的操作 ...
- 新装的Ubuntu在Nvidia显卡上分辨率不对
搜索附加驱动或者drive 然后会出现让你选择nvidia binary driver,然后点击应用更改即可.
- 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。
在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计.SQL语句.java等层面的解决方案. 解答: 1)数据库设计方面: a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 whe ...
- 【R】均值假设检验
p_value<-function(cdf,x,parament=numeric(0),side=0) { n<-length(parament) p<-switch(n+1, cd ...
- 高质量JavaScript代码
才华横溢的Stoyan Stefanov,在他写的由O’Reilly初版的新书<JavaScript Patterns>(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会 ...
- poj 2923(状态压缩+背包)
比较巧妙的一道题目,拿到题目就想用暴力直接搜索,仔细分析了下发现复杂度达到了2^n*n! ,明显不行,于是只好往背包上想. 于是又想二分找次数判断可行的方法,但是发现复杂度10^8还是很悬... 然后 ...