POJ 3613 [ Cow Relays ] DP,矩阵乘法
解题思路
首先考虑最暴力的做法。对于每一步,我们都可以枚举每一条边,然后更新每两点之间经过\(k\)条边的最短路径。但是这样复杂度无法接受,我们考虑优化。
由于点数较少(其实最多只有\(200\)个点),\(N\)较大,考虑优化\(N\)。我们发现,其实可以直接从经过\(i\)条边的最短路和经过\(j\)条边的最短路推出经过\(i+j\)条边的最短路。这样的话,我们可以把每两点间的最短路保存下来,然后用类似于矩阵快速幂的做法就可以了。
最后为了不超时,我们需要将点的编号离散。最后时间复杂度是\(O(T^3logN)\)。
参考程序
#include <cstdio>
#include <cstring>
#include <map>
#define LL long long
using namespace std;
const LL INF = 2147483647;
const LL MaxT = 110, MaxPoint = 210;
LL N, T, S, E;
LL Length[ MaxT ], I1[ MaxT ], I2[ MaxT ];
LL Num;
namespace myHash {
LL Reflection[ 1010 ];
map< LL, LL > Map;
void Hash() {
memset( Reflection, 0, sizeof( Reflection ) );
Map.clear();
for( LL i = 1; i <= T; ++i ) {
if( Map.find( I1[ i ] ) == Map.end() ) Map[ I1[ i ] ] = 1;
if( Map.find( I2[ i ] ) == Map.end() ) Map[ I2[ i ] ] = 1;
}
LL Last = 0;
for( map< LL, LL >::iterator it = Map.begin(); it != Map.end(); ++it )
Reflection[ ( *it ).first ] = ++Last;
Num = Last;
for( LL i = 1; i <= T; ++i ) {
I1[ i ] = Reflection[ I1[ i ] ];
I2[ i ] = Reflection[ I2[ i ] ];
}
return;
}
}//myHash
struct Matrix {
LL A[ MaxPoint ][ MaxPoint ];
void Clear() {
for( LL i = 1; i <= 200; ++i )
for( LL j = 1; j <= 200; ++j )
A[ i ][ j ] = INF;
return;
}
Matrix operator * ( const Matrix Other ) const {
Matrix Ans;
Ans.Clear();
for( LL i = 1; i <= Num; ++i )
for( LL j = 1; j <= Num; ++j )
for( LL k = 1; k <= Num; ++k )
Ans.A[ i ][ j ] = min( Ans.A[ i ][ j ], A[ i ][ k ] + Other.A[ k ][ j ] );
return Ans;
}
};
Matrix Basic, Ans;
void Init() {
Basic.Clear();
Ans.Clear();
for( int i = 1; i <= 200; ++i ) Ans.A[ i ][ i ] = 0;
for( int i = 1; i <= T; ++i ) {
Basic.A[ I1[ i ] ][ I2[ i ] ] = min( Basic.A[ I1[ i ] ][ I2[ i ] ], Length[ i ] );
Basic.A[ I2[ i ] ][ I1[ i ] ] = min( Basic.A[ I2[ i ] ][ I1[ i ] ], Length[ i ] );
}
return;
}
int main() {
scanf( "%lld%lld%lld%lld", &N, &T, &S, &E );
for( LL i = 1; i <= T; ++i )
scanf( "%lld%lld%lld", &Length[ i ], &I1[ i ], &I2[ i ] );
myHash::Hash();
Init();
for( ; N; N >>= 1, Basic = Basic * Basic )
if( N & 1 ) Ans = Basic * Ans;
printf( "%lld\n", Ans.A[ myHash::Reflection[ S ] ][ myHash::Reflection[ E ] ] );
return 0;
}
POJ 3613 [ Cow Relays ] DP,矩阵乘法的更多相关文章
- poj 3613 Cow Relays【矩阵快速幂+Floyd】
!:自环也算一条路径 矩阵快速幂,把矩阵乘法的部分替换成Floyd(只用一个点扩张),这样每"乘"一次,就是经过增加一条边的最短路,用矩阵快速幂优化,然后因为边数是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
Cow Relays Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5411 Accepted: 2153 Descri ...
- POJ 3613 Cow Relays(floyd+快速幂)
http://poj.org/problem?id=3613 题意: 求经过k条路径的最短路径. 思路: 如果看过<矩阵乘法在信息学的应用>这篇论文就会知道 现在我们在邻接矩阵中保存距离, ...
- POJ 3613 Cow Relays (floyd + 矩阵高速幂)
题目大意: 求刚好经过K条路的最短路 我们知道假设一个矩阵A[i][j] 表示表示 i-j 是否可达 那么 A*A=B B[i][j] 就表示 i-j 刚好走过两条路的方法数 那么同理 我们把 ...
- POJ 3613 Cow Relays 恰好n步的最短路径
http://poj.org/problem?id=3613 题目大意: 有T条路.从s到e走n步,求最短路径. 思路: 看了别人的... 先看一下Floyd的核心思想: edge[i][j]=min ...
- POJ 3613 Cow Relays【k边最短路】
题目链接:http://poj.org/problem?id=3613 题目大意: 给出n头牛,t条有向边,起点以及终点,限制每头牛放在一个点上,(一个点上可以放多头牛),从起点开始进行接力跑到终点, ...
随机推荐
- CodeFoeces GYM 101466A Gaby And Addition (字典树)
gym 101466A Gaby And Addition 题目分析 题意: 给出n个数,找任意两个数 “相加”,求这个结果的最大值和最小值,注意此处的加法为不进位加法. 思路: 由于给出的数最多有 ...
- 在Windows下安装BIND作为DNS服务器(模拟网站比较有用)
本文参考了CU下的一篇帖子,感谢:) 1.下载BIND http://ftp.isc.org/isc/bind9/9.4.3/BIND9.4.3.zip 2.安装 下载回来是zip的压缩包,解压 ...
- python网络爬虫(8)多媒体文件抽取
目的 批量下载网页图片 导入库 urllib中的request中的urlretrieve方法,可以下载图片 lxml用于解析网页 requests用于获取网站信息 import urllib from ...
- linux centos 安装jdk
1.先查看是否已经安装的有java java -version,如果有需要卸载的直接卸载 rpm -qa | grep java 下面这几个可以删除 java-1.7.0-ope ...
- 第二章:排序算法 及其他 Java代码实现
目录 第二章:排序算法 及其他 Java代码实现 插入排序 归并排序 选择排序算法 冒泡排序 查找算法 习题 2.3.7 第二章:排序算法 及其他 Java代码实现 --算法导论(Introducti ...
- L2Dwidget.js L2D网页动画人物添加
hexo 添加live2d看板动画 https://www.jianshu.com/p/3a6342e16e57 首先贴出官网代码 官网地址配置:https://www.npmjs.com/packa ...
- 应对Hadoop集群数据疯长,这里祭出了4个治理对策!
一.背景 在目前规模比较大的互联网公司中,总数据量能达到10PB甚至几十PB数据量的公司,我认为中国已经有超过了20家了.而在这些公司中,也有很多家公司的 日数据增长达到100TB+ 了. 所以我们每 ...
- iview表单验证之正则验证、函数验证
iview表单验证之正则 正则验证: 代码: loginRules: { stringLength: [ { required: true, message: '该字段不能为空', trigger: ...
- 自己实现一个简化版Mybatis框架
MyBatis框架的核心功能其实不难,无非就是动态代理和jdbc的操作,难的是写出来可扩展,高内聚,低耦合的规范的代码.本文完成的Mybatis功能比较简单,代码还有许多需要改进的地方,大家可以结合M ...
- 指针、数组与sizeof运算符
指针.数组与sizcof运算符 (1)sizeof是c语言的一个运算符(主要sizeof不是函数,虽然用法很像函数),sizeof的作用是用来返同()里面的变量或者数据类型占用的内存字节数. (2)s ...