BZOJ4386[POI2015]Wycieczki / Luogu3597[POI2015]WYC - 矩乘
Solution
想到边权为$1$的情况直接矩乘就可以得出长度$<=t$ 的路径条数, 然后二分check一下即可
但是拓展到边权为$2$,$3$ 时, 需要新建节点 $i+n$ 和 $i+2n$. 从 $i+n$ 到 $i$ 连边, $i+2n$ 到 $i+n$ 连边
若 $dis[j,i]=2$,则把 $j$ 向 $i+n$连边, 距离为 $3$时同理
但是发现这样点数就有 $3*N$ 个, 二分答案+矩乘的复杂度会非常高。
那么只能用和倍增求 $LCA$ 类似的解法, 二进制枚举
复杂度为$O(N^3 logk)$
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rd read()
#define ll long long
#define N 130
#define R register
using namespace std; int n, up, m;
ll cnt; int read() {
int X = , p = ; char c = getchar();
for (; c > '' || c < ''; c = getchar())
if (c == '-') p = -;
for (; c >= '' && c <= ''; c = getchar())
X = X * + c - '';
return X * p;
} struct matrix {
ll mp[N][N];
bool yue;
matrix() {
yue = false;
}
matrix operator * (const matrix &b) const {
matrix re;
memset(re.mp, , sizeof(re.mp));
for (R int i = ; i <= up; ++i)
for (R int j = ; j <= up; ++j) {
for (R int k = ; k <= up; ++k)
re.mp[i][j] += mp[i][k] * b.mp[k][j];
if (re.mp[i][j] < ) re.yue = true;
}
return re;
}
}ans, po[]; bool check(matrix tmp) {
ll rest = cnt;
if (tmp.yue) return ;
for (int i = ; i <= n; ++i) {
if (tmp.mp[i][] < ) return ;
if (tmp.mp[i][] - >= rest) return ;
rest -= tmp.mp[i][] - ;
}
return ;
} int main()
{
n = rd; m = rd;
up = n * ;
scanf("%lld", &cnt);
po[].mp[][] = ;
for (int i = ; i <= n; ++i) {
po[].mp[i + n][i] = ;
po[].mp[i + * n][i + n] = ;
po[].mp[i][] = ;
ans.mp[i][i] = ;
}
for (R int i = ; i <= m; ++i) {
int u = rd, v = rd, w = rd - ;
po[].mp[u][v + n * w]++;
}
bool flag = false;
int lim;
for (lim = ; lim <= ; ++lim) {
po[lim] = po[lim - ] * po[lim - ];
if (check(po[lim])) {
flag = true; break;
}
}
if (!flag ) return puts("-1"), ;
ll res = ;
for (int i = lim; ~i; --i) {
matrix tmp = ans * po[i];
if (!check(tmp)) ans = tmp, res += 1LL << i;
}
printf("%lld\n", res);
}
BZOJ4386[POI2015]Wycieczki / Luogu3597[POI2015]WYC - 矩乘的更多相关文章
- bzoj 4386: [POI2015]Wycieczki
bzoj 4386: [POI2015]Wycieczki 这题什么素质,爆long long就算了,连int128都爆……最后还是用long double卡过的……而且可能是我本身自带大常数吧,T了 ...
- 【BZOJ-4386】Wycieczki DP + 矩阵乘法
4386: [POI2015]Wycieczki Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 197 Solved: 49[Submit][Sta ...
- BZOJ4386[POI2015]Wycieczki——矩阵乘法+倍增
题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入 第 ...
- 【bzoj4386】[POI2015]Wycieczki 矩阵乘法
题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入 第 ...
- BZOJ4386 : [POI2015]Wycieczki
将每个点拆成三个点,并将转移转化为矩阵乘法,然后倍增即可求出第$k$短路的长度,注意对爆long long情况的处理. 时间复杂度$O(n^3\log k)$. #include<cstdio& ...
- BZOJ4386 [POI2015]Wycieczki 矩阵+倍增
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4386 题解 一眼就可以看出来是邻接矩阵快速幂. 可是这里的边权不为 \(1\).不过可以发现, ...
- [POI2015]Wycieczki
题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入输出 ...
- BZOJ 4386 Luogu P3597 [POI2015]Wycieczki (矩阵乘法)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4386 (luogu) https://www.luogu.org/pro ...
- BZOJ4381 : [POI2015]Odwiedziny / Luogu3591[POI2015]ODW - 分块+树剖
Solution 在步伐$pace$比较小的时候, 我们发现用前缀和直接维护会很快 而在$pace$比较大的时候, 则暴力往上跳会最优 设$blo= \sqrt{N}$ 若$pace<=blo$ ...
随机推荐
- bootstrap模态框弹框后执行Ajax
如下: editModal:模态框ID <script> $(document).ready(function() { $('#editModal').on('hidden.bs.moda ...
- 什么是FPGA的HP,HR I/O
什么是FPGA的HP,HR I/O HP接口为高速接口,用于存储器或者芯片与芯片之间的接口,HR可以接受很宽的电平标准.
- JAVA web端JS下载excel文件
JSP代码如下: JSP端引入jquery.easyui.min.js库: <script type="text/javascript" src="<c:ur ...
- 使用Tensorflow操作MNIST数据
MNIST是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会被用作深度学习的入门样例.而TensorFlow的封装让使用MNIST数据集变得更加方便.MNIST数据集是NIST数据集的 ...
- [转][C#]压缩解压
{ internal static class Compressor { public static Stream Decompress(Stream source, bool bidiStream) ...
- ORACLE procedure 一个参数分解成多个字符一点建议
测试时给什么变量就会生成什么变量, 但是在PROCEDURE时,你给的变量就会变成去掉包含字符q'/ /' 使用procedure splice添加字符串结果,是不包含q'/.删除时用的riqi赋值语 ...
- activity--生命周期总结
22.Android禁止屏幕旋转 & 旋转屏幕时保持Act内容? 21.旋转屏幕Act执行的生命周期方法? 12.ActA与 ActB互相跳转生命周期情况? 11.Act的生命周期? ==== ...
- Node安装及自定义config
下载Node.js , Windows下安装一键到底, 没有什么说的. 主要是默认无法流畅使用, 包括流畅下载, 全局缓存之类. 如下是进一步设置, 包括: - 设置淘宝镜像. - 增加Yarn(np ...
- 对窗体操作的WM消息
WM_CREATE 0x0001 应用程序创建一个窗口 WM_DESTROY 0x0002 一个窗口被销毁 WM_MOVE 0x0003 移动一个窗口 WM_SIZE 0x0005 改变一个窗口的大小 ...
- python初接触
浑浑噩噩的过了3年多大学生涯,就借此开始下定决心好好的学好一门技术,为心中那个游戏梦而努力. 正式开课的第一天(也算不的吧,毕竟昨天老师也和我们讲了python课程的大纲内容).自我总结下今天的内容吧 ...