BZOJ4386 [POI2015]Wycieczki 矩阵+倍增】的更多相关文章

题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4386 题解 一眼就可以看出来是邻接矩阵快速幂. 可是这里的边权不为 \(1\).不过可以发现,边权最多为 \(3\).但是边的数量很多,不适合拆边,那就拆点吧.对于一条 \(x \to y\) 的边,就建立一个 \(x_0\to y_{w - 1}\) 的边,\(w\) 为边权. 然后就建立矩阵就可以了.因为我们需要统计第 \(i\) 步之前一共有多少路径,所以可以新建一个节点,每个点向这个…
题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入 第一行包含三个整数n,m,k(1<=n<=40,1<=m<=1000,1<=k<=10^18).接下来m行,每行三个整数u,v,c(1<=u,v<=n,u不等于v,1<=c<=3),表示从u出发有一条到v的单向边,边长为c.可能有重边. 输出 包含一行…
题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入 第一行包含三个整数n,m,k(1<=n<=40,1<=m<=1000,1<=k<=10^18).接下来m行,每行三个整数u,v,c(1<=u,v<=n,u不等于v,1<=c<=3),表示从u出发有一条到v的单向边,边长为c.可能有重边. 输出 包含一行…
将每个点拆成三个点,并将转移转化为矩阵乘法,然后倍增即可求出第$k$短路的长度,注意对爆long long情况的处理. 时间复杂度$O(n^3\log k)$. #include<cstdio> #define N 121 typedef long long ll; int n,m,B,T,i,j,k,x,y,z,f[N][3],v[N];ll K,a[62][N][N],b[N][N],c[N][N],ans; void mul(ll a[][N],ll b[][N],ll c[][N]){…
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$ 类似的解法, 二进制枚举 复杂度为…
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4386 (luogu) https://www.luogu.org/problemnew/show/P3597 为啥这种题我都不会了啊 题解: 首先如果边权全都为\(1\), 那么就新建一个计数器,每个点连计数器,计数器连个自环.然后邻接矩阵快速幂倍增即可 如果边权有\(2\)和\(3\), 就分别新建一个节点连向出点 细节不少,特别是判断是否大于\(k\)的时候不能爆l…
4386: [POI2015]Wycieczki Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 197  Solved: 49[Submit][Status][Discuss] Description 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. Input 第一行包含三个整数n,m,k(1<=n<=40,1&…
bzoj 4386: [POI2015]Wycieczki 这题什么素质,爆long long就算了,连int128都爆……最后还是用long double卡过的……而且可能是我本身自带大常数吧,T了好长时间…… 先说一下超级汇点的计数吧,先说结论: 1.将所有点(此题中只有一级点)向一个超级汇点0连边,将矩阵乘n次,相应的f[i][j]即为从i到j的走n步方案数,f[i][0]为i到0走n步的方案数,若在给他乘一个ans矩阵(ans在前),则f[0][0]-n(点数)为所有长度等于n(指数)的…
https://vjudge.net/problem/UVA-11149 题意: 输入一个n×n矩阵A,计算A+A^2+A^3+...A^k的值. 思路: 矩阵倍增法. 处理方法如下,一直化简下去直到变成A. 代码如下: Matrix solve(Matrix base,int x) { )return base; Matrix temp=solve(); Matrix sum=add(temp,multi(pow(),temp)); ) sum=add(pow(base,x),sum); re…
题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入输出格式 输入格式: 第一行包含三个整数n,m,k(1<=n<=40,1<=m<=1000,1<=k<=10^18).接下来m行,每行三个整数u,v,c(1<=u,v<=n,u不等于v,1<=c<=3),表示从u出发有一条到v的单向边,边长为c.可能有重…