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\)的边,这样就满足单调性了
感觉最近抄写代码很有手感啊qwq
#include<bits/stdc++.h>
#define chmin(a, b) (a = a < b ? a : b)
using namespace std;
const int MAXN = 301;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, base;
struct Ma {
int m[MAXN][MAXN];
Ma() {
memset(m, 0x3f, sizeof(m));
}
Ma operator * (const Ma &rhs) const {
Ma ans;
for(int k = 1; k <= N; k++)
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++)
chmin(ans.m[i][j], m[i][k] + rhs.m[k][j]);
return ans;
}
}f[31], now, nxt;
int main() {
N = read(); M = read();
for(int i = 1; i <= M; i++) {
int x = read(), y = read(), w = read();
f[0].m[x][y] = w;
}
for(int i = 1; i <= N; i++) f[0].m[i][i] = now.m[i][i] = 0;
for(int i = 1; (1ll << i) <= N; i++) f[i] = f[i - 1] * f[i - 1], base = i;
int ans = 0;
for(int i = base; i >= 0; i--) {
bool flag = 0;
nxt = f[i] * now;
for(int j = 1; j <= N; j++) if(nxt.m[j][j] < 0) {flag = 1; break;}
if(!flag) ans += 1 << i, now = nxt;
}
printf("%d", ans + 1 > N ? 0 : ans + 1);
return 0;
}
BZOJ4773: 负环(倍增Floyd)的更多相关文章
- 【BZOJ4773】负环 倍增Floyd
[BZOJ4773]负环 Description 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得 环上的边权和为负数.保证图中不包含重边 ...
- BZOJ4773 负环(floyd+倍增)
倍增floyd求出经过<=2k条边时两点间最短路,一个点到自身的最短路就是包含该点的最小环.然后倍增找答案即可.注意初始时到自身的最短路设为0,这样求出的最短路就是经过<=2k条边的而不是 ...
- bzoj4773 负环 倍增+矩阵
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4773 题解 最小的负环的长度,等价于最小的 \(len\) 使得存在一条从点 \(i\) 到自 ...
- BZOJ 4773: 负环 倍增Floyd
现在看来这道题就非常好理解了. 可以将问题转化为求两点间经过 $k$ 个点的路径最小值,然后枚举剩余的那一个点即可. #include <cstdio> #include <cstr ...
- 2018.11.09 bzoj4773: 负环(倍增+floyd)
传送门 跟上一道题差不多. 考虑如果环上点的个数跟最短路长度有单调性那么可以直接上倍增+floyd. 然而并没有什么单调性. 于是我们最开始给每个点初始化一个长度为0的自环,于是就有单调性了. 代码: ...
- bzoj4773: 负环(倍增floyd)
浴谷夏令营例题...讲师讲的很清楚,没看题解代码就自己敲出来了 f[l][i][j]表示i到j走2^l条边的最短距离,显然有f[l][i][j]=min(f[l][i][j],f[l-1][i][k] ...
- bzoj 4773: 负环——倍增
Description 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得 环上的边权和为负数.保证图中不包含重边和自环. Input 第1 ...
- 4.28 省选模拟赛 负环 倍增 矩阵乘法 dp
容易想到 这个环一定是简单环. 考虑如果是复杂环 那么显然对于其中的第一个简单环来说 要么其权值为负 如果为正没必要走一圈 走一部分即可. 对于前者 显然可以找到更小的 对于第二部分是递归定义的. 综 ...
- bzoj4773: 负环
题解: 网上还有一种spfa+深度限制的算法 https://www.cnblogs.com/BearChild/p/6624302.html 是不加队列优化的spfa,我觉得复杂度上限是bellma ...
随机推荐
- macdown快速上手
1.断句 在结尾处输入两个空格并使用回车. 2.标题分级 使用#来进行分级,#越多级数越低 3.链接 可以使用<>里面直接加上地址 或者使用[}里面加上链接名字然后后面接上()里面就是地址 ...
- 检查java 中有多少个构造函数
检查函数中有多少个构造函数 程序设计思想: 用while来循环,并设置一个布尔类型变量c,当c是true是继续添加构造函数,当c是false是,跳出循环,程序结束.在循环体中,声明一个计数的int型变 ...
- Intellij idea maven 引用无法搜索远程仓库的解决方案
打开项目的POM文件,ALT+Insert键 出来添加引用的窗口 说明无法搜索到远程仓库,需要怎么设置呢? 在intellij idea 中配置好maven后 是这样的 如果加载失败,则需要自定义远程 ...
- 三种实现日志过滤器的方式 (过滤器 (Filter)、拦截器(Interceptors)和切面(Aspect))
1.建立RequestWrapper类 import com.g2.order.server.utils.HttpHelper; import java.io.BufferedReader; impo ...
- genkins的报错排查
[ERROR] /root/.jenkins/workspace/car/src/main/java/com/zhengxin/tool/code/Code.java:[20,64] diamond ...
- ngx_echo_module
https://github.com/openresty/echo-nginx-module echo $echo_request_body
- docker volumes?
我发现我无法mount东西出来.都是会被host的覆盖掉的.,
- 我的Python升级打怪之路【七】:网络编程
Socket网络套接字 socket通常也称为"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过”套接字“向网络发出请求或者应答网络请求. socket起源于 ...
- CentOS下MySQL的安装过程
1 查看 CentOS 自带的 mysql 输入命令: rpm -qa | grep mysql 2 将自带的MySQL卸载了 输入命令: rpm -e --nodeps mysql-libs-5.1 ...
- 【随笔】使用apt-spy来更新你的debian源
debian什么最方便,当然是用apt-get intsall 命令来安装软件了.使用apt-get什么最重要,自然是下载源了. debian版本自带的源肯定不是最快的,考虑到个人所处的位置.网速等方 ...