bzoj 4773: 负环 floyd
题目:
对于边带权的有向图,找出一个点数最小的环,使得环上的边权和为负.
2 <= n <= 300.
题解:
我们可以考虑从小到大枚举答案.
然后每次枚举更大的答案的时候就从当前的较小的答案更新过去.
更具体一点,可以设f[i][j]表示当前的步数下从i走到j的最短路.
每次更新本质就是一个简单的动态规划的状态转移.
但是这样复杂度是\(O(n^4)\)的.
肯定跑不过去.
更近一步地,从刚才的思路转变一下.
我们设\(f[d][i][j]\)表示\(i \to j\)走\(2^d\)步时的最短路.
我们可以在\(O(n^3\log n)\)的复杂度内预处理出来整个数组.
震惊! \(n^3\log n\)竟可以跑过300 !!!
然后我们利用这个数组将上面的从小到大枚举答案变为类似二分的过程!
也就是说我们可以枚举答案的二进制位.
不难发现如果\((010)_2\)成立那么\((100)_2\)也成立,所以答案具有单调性.
所以二分即可.
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;static char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
#define rg register int
#define rep(i,a,b) for(rg i=(a);i<=(b);++i)
#define per(i,a,b) for(rg i=(a);i>=(b);--i)
const int maxn = 510;
const int inf = 0x3f3f3f3f;
int dis[9][maxn][maxn];
int f[maxn][maxn],g[maxn][maxn];
int main(){
int n,m;read(n);read(m);
int u,v,w;
rep(i,1,n) rep(j,1,n) if(i != j) dis[0][i][j] = inf;
rep(i,1,m){
read(u);read(v);read(w);
dis[0][u][v] = w;
}
rep(d,1,8){
rep(i,1,n) rep(j,1,n){
if(i != j) dis[d][i][j] = inf;
else dis[d][i][j] = 0;
}
rep(k,1,n) rep(i,1,n) rep(j,1,n){
dis[d][i][j] = min(dis[d-1][i][k]+dis[d-1][k][j],dis[d][i][j]);
}
}
rep(i,1,n) rep(j,1,n){
if(i != j) g[i][j] = inf;
else g[i][j] = 0;
}
bool flag;
int ans = 0;
per(d,8,0){
rep(i,1,n) rep(j,1,n) f[i][j] = g[i][j];
rep(k,1,n) rep(i,1,n) rep(j,1,n){
f[i][j] = min(f[i][j],min(g[i][k]+dis[d][k][j],dis[d][i][k]+g[k][j]));
}
flag = false;
rep(i,1,n) if(f[i][i] < 0){
flag = true;
break;
}
if(flag) continue;
rep(i,1,n) rep(j,1,n) g[i][j] = f[i][j];
ans |= 1 << d;
}
if(++ans > n) puts("0");
else printf("%d\n",ans); return 0;
}
bzoj 4773: 负环 floyd的更多相关文章
- bzoj 4773: 负环——倍增
Description 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得 环上的边权和为负数.保证图中不包含重边和自环. Input 第1 ...
- BZOJ 4773: 负环 倍增Floyd
现在看来这道题就非常好理解了. 可以将问题转化为求两点间经过 $k$ 个点的路径最小值,然后枚举剩余的那一个点即可. #include <cstdio> #include <cstr ...
- HDU 1217 Arbitrage(Bellman-Ford判断负环+Floyd)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217 题目大意:问你是否可以通过转换货币从中获利 如下面这组样例: USDollar 0.5 Brit ...
- 负环 BZOJ 4773
负环 [问题描述] 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得环上的边权和为负数.保证图中不包含重边和自环. [输入格式] 第1两个 ...
- 递归型SPFA+二分答案 || 负环 || BZOJ 4773
题解: 基本思路是二分答案,每次用Dfs型SPFA验证该答案是否合法. 一点细节我注释在代码里了. 代码: #include<cstdio> #include<cstring> ...
- POJ2240 Arbitrage(Floyd判负环)
跑完Floyd后,d[u][u]就表示从u点出发可以经过所有n个点回到u点的最短路,因此只要根据数组对角线的信息就能判断是否存在负环. #include<cstdio> #include& ...
- bzoj 1486: [HNOI2009]最小圈 dfs求负环
1486: [HNOI2009]最小圈 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1022 Solved: 487[Submit][Status] ...
- BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)
BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值, ...
- BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划
BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划 更清真的题面链接:https://files.cnblogs.com/files/winmt/merchant%28zh_ ...
随机推荐
- 模型层TP框架数据库的操作
在shop入口的文件下的HOME文件夹中使用模型层 第一步修改配置模块把数据库的各种链接做好,打开HOME中的conf文件夹中的config.php,找到Thinkphp文件加下的conf文件打开co ...
- 实现asp.net mvc页面二级缓存,提高访问性能
实现的mvc二级缓存的类 //Asp.Net MVC视图页面二级缓存 public class TwoLevelViewCache : IViewLocationCache { private rea ...
- web 文件下载
response.reset(); response.setContentType("octets/stream"); response.addHeader("Conte ...
- iOS-事件传递和响应机制
转自:http://www.jianshu.com/p/2e074db792ba 前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view ...
- 洛谷2704 [NOI2001]炮兵阵地
题目戳这里 Solution 状压DP很好的入门题,用熟练位运算貌似也没那么难. 首先分析一下题目: 看见n=100,m=10,立马就想到了状压,看起来也像DP,所以我们还是采用行号为阶段的状压DP. ...
- 8.Django模型类例子
这里定义4个模型 作者:一个作者有姓名 作者详情:包括性别,email,出生日期, 出版商:名称,地址,城市,省,国家,网站 书籍:名称,日期 分析: 作者详情和作者一对一的关系 一本书可以有多个作者 ...
- Open AI Gym简介
介绍 OpenAI Gym是一款用于研发和比较强化学习算法的工具包,它支持训练智能体(agent)做任何事——从行走到玩Pong或围棋之类的游戏都在范围中. OpenAI Gym 是一个用于开发和比较 ...
- 解决编译caffe2遇到的坑
首先我们要从源码克隆caffe2的库: git clone --recursive https://github.com/caffe2/caffe2.git 执行下载过程会报这样的错: Cloning ...
- Redis高级进阶(二)
一.消息通知 在一些网站上,经常会有一些发布/订阅或者邮件订阅的功能,尤其一些博客上.其实这种问题很常见,当页面需要进行如发送邮件.复杂的计算时会阻塞页面的渲染.为了避免用户等待太久,应该使用其他进程 ...
- 【Flask】下载多个文件
使用zipfile模块可以将多个文件打包成zip文件进行下载,但是常规的操作方式会在服务器磁盘上生成一个zip文件占用磁盘空间. 后引入BytesIO将文件写入到内存中然后下载: def dl_pla ...