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. PCB行业研究

    PCB行业研究 PCB产业上下游 关于HDI电路板 主要用于手机行业,对电路板面积有严格要求. 啥时候铜材料上涨

  2. FPGA 中三角函数的实现

    FPGA 中三角函数的实现

  3. USB3.0及NVME SSD安装WIN7X64

    USB3.0及NVME SSD安装WIN7X64https://tieba.baidu.com/p/4822034273?pn=1所有的人都是菜鸟过来的,不过有些人懂得自己动手找到答案:有些人则是懒得 ...

  4. 使用IDE之webstorm

    最近打算试试用webstorm,今天从vscode换成了webstorm. 官方下载webstorm 1.下载之后安装,我全部选择默认,因为webstorm是付费ide,到启动面板时,选择激活选项. ...

  5. Java中的权限修饰符private、protected、public

    java中的修饰符分类: 权限修饰符: private, default, protected, public 状态修饰符: static, final 抽象修饰符: abstract 权限修饰符 我 ...

  6. Northwind学习笔记

    一.单表查询 --1.查询订购日期在1996年7月1日至1996年7月15日之间的订单的订购日期.订单ID.客户ID和雇员ID等字段的值 SELECT OrderID , CustomerID , E ...

  7. 两个有序数组中的中位数以及求第k个最小数的值

    解法参考 <[分步详解]两个有序数组中的中位数和Top K问题> https://blog.csdn.net/hk2291976/article/details/51107778 里面求中 ...

  8. android 开发 View _9_ 实现渐变功能(直线与圆形)

    参考博客:https://blog.csdn.net/iispring/article/details/50500106/ android颜色渐变的分类有: LinearGradient线性渐变 线性 ...

  9. centos7 卸载 jdk

    ################ jdk 的安装 ###########################参考:https://www.cnblogs.com/Dylansuns/p/6974272.h ...

  10. Rhythmk 一步一步学 JAVA(6): JSP 语法学习笔记

    1.修改JSP页面模版: 找到MyEclips安装目录,搜索“Jsp.vtl”,找到该文件修改编码,以及一些不需要用到的代码. 2.查找项目生成的Servlet文件路径: 查看当前项目父级目录搜索 . ...