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条有向边,起点以及终点,限制每头牛放在一个点上,(一个点上可以放多头牛),从起点开始进行接力跑到终点, ...
随机推荐
- 第二大矩阵面积--(stack)牛客多校第二场-- Second Large Rectangle
题意: 给你一幅图,问你第二大矩形面积是多少. 思路: 直接一行行跑stack求最大矩阵面积的经典算法,不断更新第二大矩形面积,注意第二大矩形可能在第一大矩形里面. #define IOS ios_b ...
- AppCan模拟器调试
来源: 1, 页面CSS调试 2, JS调试 3, 插件请打包后手机调试 4, 打开另一个页面示例: appcan.button("#myBtn", "ani-uct&q ...
- 如何用纯 CSS 创作一个晃动的公告板
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/wjZoGV 可交互视频教 ...
- Redis利用Pipeline加速查询速度的方法
1. RTT Redis 是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下 Redis 客户端执行一条命令分为如下四个过程: 发送命令 命令排队 命令执行 返回结果 客户 ...
- 解决 mysql (10038)
1.授权 mysql>grant all privileges on *.* to 'root'@'%' identified by 'youpassword' with grant o ...
- Nginx启动错误 Failed to read PID from file /run/nginx.pid 的处理方法
问题产生原因 因为 nginx 启动需要一点点时间,而 systemd 在 nginx 完成启动前就去读取 pid file 造成读取 pid 失败 解决方法 让 systemd 在执行 ExecSt ...
- WPF中Matrix介绍
最近在做一些图形变换操作的功能,图形变换涉及大学中的矩阵运算部分的知识,又重新复习了一下矩阵.这里做一下记录.由于不知道矩阵如何输入,一个个截图又麻烦,所以这里就全部用截图了^-^.
- 24、Nginx缓存web服务
通常情况下缓存是用来减少后端压力, 将压力尽可能的往前推, 减少后端压力,提高网站并发延时 1.缓存常见类型 服务端缓存 代理缓存, 获取服务端内容进行缓存 客户端浏览器缓存 Nginx代理缓存原理 ...
- Maven配置和使用
Eclipse下的Maven开发环境搭建. 现在要用到Eclipse开发Maven的项目,需要配置Maven,简单整理下配置方法. 1.下载Maven安装包,http://maven.apache.o ...
- 标准模板库(STL)
组件: 容器:管理某类对象的集合. 迭代器:用来在一个对象集合内遍历元素. 算法:处理集合内的元素. 容器 序列式容器:顾名思义.array,vector,deque,list 和 forward_l ...