【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 ...
随机推荐
- MySQL5.6.17 绿色版 安装配置
安装篇: 下载完成之后,用解压工具解压到没有中文.空格的文件夹下,解压后的显示如图: 个人建议把解压后的文件夹重命名,如果有中文去掉中文,便于自己理解使用,如图: 打开重命名之后的文件夹,找到mysq ...
- http的GET方法参数中不能传列表,接收端的key会变
如下 async initTable() { await getHostAttributesForUser({'username': this.username}).then(response =&g ...
- Mycat分布式数据库架构解决方案--搭建MySQL读写分离环境--一主多从
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 本文主 ...
- Python进阶----多表查询(内连,左连,右连), 子查询(in,带比较运算符)
Python进阶----多表查询(内连,左连,右连), 子查询(in,带比较运算符) 一丶多表查询 多表连接查询的应用场景: 连接是关系数据库模型的主要特点,也是区别于其他 ...
- 你可能还不知道的关于JavaScript类型的细节?
类型 七种类型: Undefined Null Boolean String Number Symbol Object Undefined.Null 阅读问题:为什么有的编程规范要求使用void 0 ...
- CSS3 2D 变换
CSS2D transform 表示2D变换,目前获得了各主流浏览器的支持,是CSS3中具有颠覆性的特征之一,可以实现元素的位移.旋转.倾斜.缩放,甚至支持矩阵方式,可以取代大量之前只能靠Flash才 ...
- vector中的push_back函数的意思是什么
push_back 就是在vector的末尾插入一个元素, vector 中的erase()函数,从指定容器删除指定位置的元素或者某段范围内的元素,删除之后,返回值也是一个迭代器,指向最后一个删除 ...
- kbmmw 5.10.10 发布
这个版本主要是bug修正. New stuff ========= - Added OnException event property to TkbmMWSchedu ...
- linux下apache和tomcat整合
一 Apache与Tomcat比较联系 apache支持静态页,tomcat支持动态的,比如servlet等. 一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是由 ...
- 用 ConfigMap 管理配置
1. ConfigMap介绍管理配置 ConfigMap介绍 Secret 可以为 Pod 提供密码.Token.私钥等敏感数据:对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap ...