首页
Python
Java
IOS
Andorid
NodeJS
JavaScript
HTML5
【
2018.11.09 bzoj4773: 负环(倍增+floyd)
】的更多相关文章
2018.11.09 bzoj4773: 负环(倍增+floyd)
传送门 跟上一道题差不多. 考虑如果环上点的个数跟最短路长度有单调性那么可以直接上倍增+floyd. 然而并没有什么单调性. 于是我们最开始给每个点初始化一个长度为0的自环,于是就有单调性了. 代码: #pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; typedef long long ll; inline ll read(){ ll ans=0; char ch=getchar(); while(!isd…
BZOJ4773: 负环(倍增Floyd)
题意 题目链接 Sol 倍增Floyd,妙妙喵 一个很显然的思路(然而我想不到是用\(f[k][i][j]\)表示从\(i\)号点出发,走\(k\)步到\(j\)的最小值 但是这样复杂度是\(O(n^4)\)的 考虑倍增优化,设\(f[k][i][j]\)表示从\(i\)号点出发,走\(2^k\)步到\(j\)的最小值 每次转移相当于把两个矩阵乘起来,复杂度\(O(n^3logn)\) 注意答案不一定有单调性,可以对每个点连一条向自己边权为\(0\)的边,这样就满足单调性了 感觉最近抄写代码很有…
2018.11.09 bzoj2165: 大楼(倍增+floyd)
传送门 先倍增出iii使得2i2^i2i时间时刚好有每个点能够到mmm层及以上. 然后就可以用floyd+floyd+floyd+倍增求出刚好不超过mmm层的时间,最后再补一层就行了. 代码: #pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; typedef long long ll; inline ll read(){ ll ans=0; char ch=getchar(); while(!isdigit…
【BZOJ4773】负环 倍增Floyd
[BZOJ4773]负环 Description 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得 环上的边权和为负数.保证图中不包含重边和自环. Input 第1两个整数n, m,表示图的点数和边数. 接下来的m行,每<=三个整数ui, vi, wi,表<=有一条从ui到vi,权值为wi的有向边. 2 <= n <= 300 0 <= m <= n(n <= 1) 1 <= ui, vi <…
BZOJ4773 负环(floyd+倍增)
倍增floyd求出经过<=2k条边时两点间最短路,一个点到自身的最短路就是包含该点的最小环.然后倍增找答案即可.注意初始时到自身的最短路设为0,这样求出的最短路就是经过<=2k条边的而不是恰好2k条边的了. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> u…
bzoj4773 负环 倍增+矩阵
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4773 题解 最小的负环的长度,等价于最小的 \(len\) 使得存在一条从点 \(i\) 到自己存在一条长度 \(\leq len\) 的负权路径. 为了把 \(\leq len\) 转化为 \(=len\),我们可以给每一个点建立有个边权为 \(0\) 的自环. 所以考虑倍增邻接矩阵,维护两点之间的经过 \(2^i\) 条边的最短路. 倍增的时候判断走了那么多步有没有负环就可以了. 最后结…
BZOJ 4773: 负环 倍增Floyd
现在看来这道题就非常好理解了. 可以将问题转化为求两点间经过 $k$ 个点的路径最小值,然后枚举剩余的那一个点即可. #include <cstdio> #include <cstring> #include <algorithm> #define N 303 #define inf 1000000000 #define setIO(s) freopen(s".in","r",stdin) using namespace std;…
2018.11.09 bzoj1706: relays 奶牛接力跑(倍增+floyd)
传送门 倍增+floyd板子题. 先列出状态fi,j,kf_{i,j,k}fi,j,k表示经过iii条边从jjj到kkk的最短路. 然后发现可以用fi−1,j,kf_{i-1,j,k}fi−1,j,k和f1,j,kf_{1,j,k}f1,j,k来转移出fi,j,kf_{i,j,k}fi,j,k. 由于floydfloydfloyd可以看做是矩阵乘法,因此可以用倍增/快速幂优化矩阵转移. 代码: #include<bits/stdc++.h> #include<tr1/unorde…
bzoj4773: 负环(倍增floyd)
浴谷夏令营例题...讲师讲的很清楚,没看题解代码就自己敲出来了 f[l][i][j]表示i到j走2^l条边的最短距离,显然有f[l][i][j]=min(f[l][i][j],f[l-1][i][k]+f[l-1][k][j]). 是否有负环可以用f[l][i][i]是否<0来判,我们从高位往低位贪心,找到走的边数最大的没有负环的图,把最大走的边数+1就必定有负环,也就是答案了. #include<iostream> #include<cstring> #include<…
bzoj 4773: 负环——倍增
Description 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得 环上的边权和为负数.保证图中不包含重边和自环. Input 第1两个整数n, m,表示图的点数和边数. 接下来的m行,每<=三个整数ui, vi, wi,表<=有一条从ui到vi,权值为wi的有向边. 2 <= n <= 300 0 <= m <= n(n <= 1) 1 <= ui, vi <= n |wi| <…