题目:

对于边带权的有向图,找出一个点数最小的环,使得环上的边权和为负.

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的更多相关文章

  1. bzoj 4773: 负环——倍增

    Description 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得 环上的边权和为负数.保证图中不包含重边和自环. Input 第1 ...

  2. BZOJ 4773: 负环 倍增Floyd

    现在看来这道题就非常好理解了. 可以将问题转化为求两点间经过 $k$ 个点的路径最小值,然后枚举剩余的那一个点即可. #include <cstdio> #include <cstr ...

  3. HDU 1217 Arbitrage(Bellman-Ford判断负环+Floyd)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217 题目大意:问你是否可以通过转换货币从中获利 如下面这组样例: USDollar 0.5 Brit ...

  4. 负环 BZOJ 4773

    负环 [问题描述] 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得环上的边权和为负数.保证图中不包含重边和自环. [输入格式] 第1两个 ...

  5. 递归型SPFA+二分答案 || 负环 || BZOJ 4773

    题解: 基本思路是二分答案,每次用Dfs型SPFA验证该答案是否合法. 一点细节我注释在代码里了. 代码: #include<cstdio> #include<cstring> ...

  6. POJ2240 Arbitrage(Floyd判负环)

    跑完Floyd后,d[u][u]就表示从u点出发可以经过所有n个点回到u点的最短路,因此只要根据数组对角线的信息就能判断是否存在负环. #include<cstdio> #include& ...

  7. bzoj 1486: [HNOI2009]最小圈 dfs求负环

    1486: [HNOI2009]最小圈 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1022  Solved: 487[Submit][Status] ...

  8. BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)

    BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值, ...

  9. BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划

    BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划 更清真的题面链接:https://files.cnblogs.com/files/winmt/merchant%28zh_ ...

随机推荐

  1. c_str()方法使用

    语法: const char *c_str(); c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过 ...

  2. USB-HID鼠标、键盘通讯格式(转) 与本人实际测试结果

    内容为网络转载,如有版权问题请联系删除 USB鼠标键盘协议介绍. 鼠标发送给PC的数据每次4个字节:BYTE1 BYTE2 BYTE3 BYTE4.定义分别是:BYTE1 -- |--bit7:    ...

  3. 【BZOJ3779】重组病毒 LCT+DFS序

    [BZOJ3779]重组病毒 Description 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力极强.为了阻止这种病毒传播,某安全机构策 ...

  4. (比赛)A - Simple String Problem

    A - Simple String Problem Time Limit:10000MS     Memory Limit:65536KB     64bit IO Format:%lld & ...

  5. 小团队Git协作流程

    git和svn 最大的差异在于git是分布式的管理方式而svn是集中式的管理方式. 集中式 集中式代码管理的核心是服务器,所有开发者在开始coding之前必须从服务器获取代码,然后开发,最后解决冲突, ...

  6. java Filter的简单使用

    java web中的过滤器的简单使用.直接上代码.1.web.xml <?xml version="1.0" encoding="UTF-8"?> ...

  7. java 死锁产生原因及解锁(转)

    原文地址 进程死锁及解决办法 一.要点提示 (1) 掌握死锁的概念和产生死锁的根本原因. (2) 理解产生死锁的必要条件--以下四个条件同时具备:互斥条件.不可抢占条件.占有且申请条件.循环等待条件. ...

  8. linux后台开发必备技能

    一.linux和os: 1.命令:netstat tcpdump ipcs ipcrm  这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验 2.cpu 内存 硬盘 等等与系统性能调试相关的 ...

  9. html post

    post请求对应的html页面 页面效果 html代码 <html> <body> <form method="post" > First na ...

  10. python cookbook 数据结构

    保留最后n个元素: from collections import deque def search (lines, pattern, history=): previous_lines = dequ ...