【BZOJ2095】[Poi2010]Bridges
【BZOJ2095】[Poi2010]Bridges
题面
题解
首先可以想到二分答案,那么我们就是要求我们新图中给所有边定向是否存在欧拉回路。
而有向图存在欧拉回路的充要条件为所有顶点的入度等于出度且该图是连通图,我们考虑在这一点上做文章。
令一个点的入度减出度表示一个点的度数差\(\phi\),首先我们随机定向,假设有两个点\(u\),\(v\),此时我们从\(u\)连一条边向\(v\)。
那么我们每改变一次连边的方向,会使\(\phi_u\)减去\(2\),\(\phi_v\)加上\(2\)。
如果此时存在一点\(x\),\(\phi_x\)为奇数,那么显然无解。
考虑网络流。首先连边\(v\rightarrow u\)流量为\(1\)表示一次转换方向,接着我们对于所有\(\phi>0\)的点\(x\)连边\(S\rightarrow x\),流量为\(\frac {\phi}2\);否则对于所有\(\phi<0\)的点\(x\)连边\(x\rightarrow T\),流量为\(-\frac {\phi}2\)。
直接判断满流即可。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
}
const int MAX_N = 1005;
struct Graph { int to, cap, next; } e[MAX_N << 5];
int fir[MAX_N], e_cnt;
void clearGraph() { memset(fir, -1, sizeof(fir)); e_cnt = 0; }
void Add_Edge(int u, int v, int c) {
e[e_cnt] = (Graph){v, c, fir[u]}, fir[u] = e_cnt++;
e[e_cnt] = (Graph){u, 0, fir[v]}, fir[v] = e_cnt++;
}
struct Edge { int u, v, a, b; } c[MAX_N << 1];
int N, M, deg[MAX_N];
int level[MAX_N];
bool bfs(int s, int t) {
queue<int> que;
for (int i = 0; i <= N + 1; i++) level[i] = -1;
level[s] = 0, que.push(s);
while (!que.empty()) {
int x = que.front(); que.pop();
for (int i = fir[x]; ~i; i = e[i].next) {
int v = e[i].to; if (!e[i].cap || ~level[v]) continue;
level[v] = level[x] + 1, que.push(v);
}
}
return level[t] != -1;
}
int iter[MAX_N];
int dfs(int x, int t, int f) {
if (x == t) return f;
for (int &i = iter[x]; ~i; i = e[i].next) {
int v = e[i].to;
if (e[i].cap && level[v] > level[x]) {
int d = dfs(v, t, min(f, e[i].cap));
if (d) {
e[i].cap -= d;
e[i ^ 1].cap += d;
return d;
}
}
}
level[x] = -1;
return 0;
}
int dinic(int s, int t) {
int res = 0;
while (bfs(s, t)) {
for (int i = 0; i <= N + 1; i++) iter[i] = fir[i];
int f;
while ((f = dfs(s, t, 1e9))) res += f;
}
return res;
}
bool check(int mid) {
clearGraph();
for (int i = 1; i <= N; i++) deg[i] = 0;
for (int i = 1; i <= M; i++) {
if (c[i].a <= mid) --deg[c[i].u], ++deg[c[i].v];
if (c[i].b <= mid) Add_Edge(c[i].v, c[i].u, 1);
}
for (int i = 1; i <= N; i++) if (deg[i] & 1) return 0;
int cnt = 0, s = 0, t = N + 1;
for (int i = 1; i <= N; i++) {
if (deg[i] > 0) Add_Edge(s, i, deg[i] >> 1), cnt += deg[i] >> 1;
if (deg[i] < 0) Add_Edge(i, t, -deg[i] >> 1);
}
return dinic(s, t) == cnt;
}
int main () {
#ifndef ONLINE_JUDGE
freopen("cpp.in", "r", stdin);
#endif
N = gi(), M = gi();
int l = 1e9, r = 1;
for (int i = 1; i <= M; i++) {
c[i] = (Edge){gi(), gi(), gi(), gi()};
if (c[i].a > c[i].b) swap(c[i].u, c[i].v), swap(c[i].a, c[i].b);
l = min(l, c[i].a), r = max(r, c[i].b);
}
if (!check(r)) return puts("NIE") & 0;
int ans = r;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) ans = mid, r = mid - 1;
else l = mid + 1;
}
printf("%d\n", ans);
return 0;
}
【BZOJ2095】[Poi2010]Bridges的更多相关文章
- 【BZOJ2095】[Poi2010]Bridges 动态加边网络流
[BZOJ2095][Poi2010]Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个 ...
- 【BZOJ2084】[Poi2010]Antisymmetry(manarcher)
[BZOJ2084][Poi2010]Antisymmetry(manarcher) 题面 BZOJ 洛谷 题解 一眼马拉车吧...明显就是在回文串的基础上随便改了改. 似乎还可以魔改回文树,然而我这 ...
- 【BZOJ2087】[Poi2010]Sheep 几何+DP
[BZOJ2087][Poi2010]Sheep Description Lyx的QQ牧场养了很多偶数个的羊,他是Vip,所以牧场是凸多边形(畸形).现在因为他开挂,受到了惩罚,系统要求他把牧场全部分 ...
- 【BZOJ2081】[Poi2010]Beads hash+调和级数
[BZOJ2081][Poi2010]Beads Description Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串), ...
- 【BZOJ2083】[Poi2010]Intelligence test 二分
[BZOJ2083][Poi2010]Intelligence test Description 霸中智力测试机构的一项工作就是按照一定的规则删除一个序列的数字,得到一个确定的数列.Lyx很渴望成为霸 ...
- 【BZOJ2096】[Poi2010]Pilots 双指针+单调队列
[BZOJ2096][Poi2010]Pilots Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串, ...
- 【BZOJ-2095】Bridge 最大流 + 混合图欧拉回路 + 二分
2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 604 Solved: 218[Submit][Stat ...
- 【BZOJ2095】【POI2010】Bridge 网络流
题目大意 给你一个无向图,每条边的两个方向的边权可能不同.要求找出一条欧拉回路使得路径上的边权的最大值最小.无解输出"NIE". \(2\leq n\leq 1000,1\le ...
- 【bzoj2084】[Poi2010]Antisymmetry
2084: [Poi2010]Antisymmetry Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1205 Solved: 756[Submit ...
随机推荐
- lnmp1.4安装包
https://lnmp.org/install.html nginx中虚拟机中的配置 location ~ .*\.(php|php5)?$ { try_files $uri =404; fastc ...
- Java可视化计算器
利用java中的AWT和SWING包来做可视化界面. 首先来简单了解一下这两个包: AWT和Swing都是Java中用来做可视化界面的.AWT(Abstract Window Toolkit):抽象窗 ...
- 对ssm框架里面的一些常用注解的理解
@Componcnt :作用就是把当前类对象存入spring容器中 属性:value 用于指定bean的id 当我们不写的时候默认就是当前类名,并且首字母要小写 ------------------- ...
- quota - linux磁盘配额管理
磁盘管理系列 linux磁盘管理系列一:磁盘配额管理 http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_040_quota.html l ...
- TP5日志打印方法封装
需求:在开发及测试过程中需要打印日志,并且可以将日志内容打印到指定文件,这样方便查看. 过程: 1. 打开think\Log文件,在该文件中添加一个静态方法,代码如下: /** * @param $m ...
- Solr基础理论【相关度计算】
一.简介 寻找匹配的文档是构建优质搜索体验的关键步骤,但这仅仅是第一步.大多数用户不愿意通过逐页翻阅搜索结果来找到想要的文档.根据一般经验,仅有10%的用户在网页搜索中有意愿继续翻阅第一页以后的搜索结 ...
- elasticsearch Terms Query 实现类似于sql in查询
本文demo基于elasticsearch 5.1.1, 项目中使用的还是较早的版本 例如 import com.alibaba.fastjson.JSON; import org.elastics ...
- Golang 在 Mac、Linux、Windows 下如何交叉编译
转自 https://blog.csdn.net/panshiqu/article/details/53788067 Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下 ...
- springboot 集成J2Cache
J2Cache 是 OSChina 目前正在使用的两级缓存框架.第一级缓存使用 Ehcache,第二级缓存使用 Redis .由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目 ...
- filter - date 日期插件
为什么要用date插件: 我们希望日志展示的时间就是日志生成的时间,一般日志中都会附加时间,这样方便根据时间查找问题.但在logstash中,默认使用@timestamp时间值来表示日志的时间,@ti ...