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. 阿里云centos5升级yum源为6

    升级后出现Errno -3] Error performing checksum 需要安装 python-hashlib Python 2.4 安装 hashlib 2012年11月13日 14:29 ...

  2. eclipse运行web项目注意有些坑

  3. 实验-12-JSP简单入门

    参考资料 JSP实验参考文件 主要看实验任务书 实验1. 第一个HTML页面与Tomcat 实验内容:任务书中的JSP-实验1. 1.1 EclipseJEE的使用 新建Tomcat Server 新 ...

  4. Ubuntu 14.10 下Hive配置

    1 系统环境 Ubuntu 14.10 JDK-7 Hadoop 2.6.0 2 安装步骤 2.1 下载Hive 我第一次安装的时候,下载的是Hive-1.2.1,配置好之后,总是报错 [ERROR] ...

  5. 《女神异闻录 5》的 UI 设计

    转自:https://www.zhihu.com/question/50995871?sort=created <女神异闻录5>是近两年最为火热的JRPG游戏之一,它的出色不仅在于剧情暗讽 ...

  6. Python协程、异步IO

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...

  7. 【转】完整精确导入Kernel与Uboot参与编译了的代码到Source Insight,Understand, SlickEdit

    The linux kernel and u-boot contains lots of files, when we want to broswe the source code,we just w ...

  8. 安装和激活Office 2019

    有条件请支持正版!相比费尽力气找一个可能不太安全的激活工具,直接买随时随地更新的Office 365确实是最好的办法.暂时没有经济实力的,可以看看这篇文章.下载OTP工具 首先到Office Tool ...

  9. tmp32dll\sha1-586.asm(1432) : error A2070:invalid instruction operands 编译openssl出错

    vs命令行工具编译openssl最新版本的时候报perl版本太低. 后来换了openssl 1.0.2的版本旧版本到是可以正常编译了,但是1.0.2应该是版本还是优点新. 编译的时候报了下面的错误: ...

  10. Fiddler使用

    1.下载安装 百度下载后,傻瓜式安装. 2.设置 Tools->options->https->选中"Decrpt HTTPS traffic"(Fiddler就 ...