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 - 矩乘的更多相关文章

  1. bzoj 4386: [POI2015]Wycieczki

    bzoj 4386: [POI2015]Wycieczki 这题什么素质,爆long long就算了,连int128都爆……最后还是用long double卡过的……而且可能是我本身自带大常数吧,T了 ...

  2. 【BZOJ-4386】Wycieczki DP + 矩阵乘法

    4386: [POI2015]Wycieczki Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 197  Solved: 49[Submit][Sta ...

  3. BZOJ4386[POI2015]Wycieczki——矩阵乘法+倍增

    题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入 第 ...

  4. 【bzoj4386】[POI2015]Wycieczki 矩阵乘法

    题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入 第 ...

  5. BZOJ4386 : [POI2015]Wycieczki

    将每个点拆成三个点,并将转移转化为矩阵乘法,然后倍增即可求出第$k$短路的长度,注意对爆long long情况的处理. 时间复杂度$O(n^3\log k)$. #include<cstdio& ...

  6. BZOJ4386 [POI2015]Wycieczki 矩阵+倍增

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4386 题解 一眼就可以看出来是邻接矩阵快速幂. 可是这里的边权不为 \(1\).不过可以发现, ...

  7. [POI2015]Wycieczki

    题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入输出 ...

  8. BZOJ 4386 Luogu P3597 [POI2015]Wycieczki (矩阵乘法)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4386 (luogu) https://www.luogu.org/pro ...

  9. BZOJ4381 : [POI2015]Odwiedziny / Luogu3591[POI2015]ODW - 分块+树剖

    Solution 在步伐$pace$比较小的时候, 我们发现用前缀和直接维护会很快 而在$pace$比较大的时候, 则暴力往上跳会最优 设$blo= \sqrt{N}$ 若$pace<=blo$ ...

随机推荐

  1. bootstrap模态框弹框后执行Ajax

    如下: editModal:模态框ID <script> $(document).ready(function() { $('#editModal').on('hidden.bs.moda ...

  2. 什么是FPGA的HP,HR I/O

    什么是FPGA的HP,HR I/O HP接口为高速接口,用于存储器或者芯片与芯片之间的接口,HR可以接受很宽的电平标准.

  3. JAVA web端JS下载excel文件

    JSP代码如下: JSP端引入jquery.easyui.min.js库: <script type="text/javascript" src="<c:ur ...

  4. 使用Tensorflow操作MNIST数据

    MNIST是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会被用作深度学习的入门样例.而TensorFlow的封装让使用MNIST数据集变得更加方便.MNIST数据集是NIST数据集的 ...

  5. [转][C#]压缩解压

    { internal static class Compressor { public static Stream Decompress(Stream source, bool bidiStream) ...

  6. ORACLE procedure 一个参数分解成多个字符一点建议

    测试时给什么变量就会生成什么变量, 但是在PROCEDURE时,你给的变量就会变成去掉包含字符q'/ /' 使用procedure splice添加字符串结果,是不包含q'/.删除时用的riqi赋值语 ...

  7. activity--生命周期总结

    22.Android禁止屏幕旋转 & 旋转屏幕时保持Act内容? 21.旋转屏幕Act执行的生命周期方法? 12.ActA与 ActB互相跳转生命周期情况? 11.Act的生命周期? ==== ...

  8. Node安装及自定义config

    下载Node.js , Windows下安装一键到底, 没有什么说的. 主要是默认无法流畅使用, 包括流畅下载, 全局缓存之类. 如下是进一步设置, 包括: - 设置淘宝镜像. - 增加Yarn(np ...

  9. 对窗体操作的WM消息

    WM_CREATE 0x0001 应用程序创建一个窗口 WM_DESTROY 0x0002 一个窗口被销毁 WM_MOVE 0x0003 移动一个窗口 WM_SIZE 0x0005 改变一个窗口的大小 ...

  10. python初接触

    浑浑噩噩的过了3年多大学生涯,就借此开始下定决心好好的学好一门技术,为心中那个游戏梦而努力. 正式开课的第一天(也算不的吧,毕竟昨天老师也和我们讲了python课程的大纲内容).自我总结下今天的内容吧 ...