BZOJ 2095 Bridges
题目传送门
分析:
首先就是二分
然后。。。
混合图欧拉回路是sm。。。
看了题解Orz
首先要回到原来的点的话,那么每个点入度和出度要相等。。。
这。。和网络流进入点之后就出去不是一样的吗。。
又由于有的边可以反向
反向后又会改变两个点+-2的流量
于是考虑上下界网络流
每条单向边容量设为1
每条双向边随便定向,连(-1,1)的边
wsm会出现负数?因为-1可以代表反向流
但是貌似并不影响上下界网络流诶。。。
哦摩西罗伊2333
直接跑就好了
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm> #define maxn 3005
#define maxm 500005
#define INF 0x3f3f3f3f using namespace std; inline int getint()
{
int num=,flag=;char c;
while((c=getchar())<''||c>'')if(c=='-')flag=-;
while(c>=''&&c<='')num=num*+c-,c=getchar();
return num*flag;
} int n,m,S,T;
int fir[maxn],nxt[maxm],to[maxm],cap[maxm],cnt;
int h[maxn],tp[maxn];
struct node{
int a,b,c,d;
}E[maxm];
int f[maxn]; inline void newnode(int u,int v,int w)
{to[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt,cap[cnt]=w;}
inline void insert(int u,int v,int w)
{newnode(u,v,w),newnode(v,u,);} inline bool bfs()
{
memset(h,-,sizeof h);
queue<int>Q;h[S]=,Q.push(S);
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=fir[u];i;i=nxt[i])
if(cap[i]&&!~h[to[i]])h[to[i]]=h[u]+,Q.push(to[i]);
}
return ~h[T];
} inline int dfs(int u,int flow)
{
if(u==T)return flow;
int used=;
for(int i=tp[u];i;i=nxt[i])
{
tp[u]=i;
if(cap[i]&&h[to[i]]==h[u]+)
{
int w=flow-used;
w=dfs(to[i],min(cap[i],w));
cap[i]-=w,cap[i^]+=w,used+=w;
if(used==flow)return flow;
}
}
if(!used)h[u]=-;
return used;
} inline int dinic()
{
int num=;
while(bfs())memcpy(tp,fir,sizeof fir),num+=dfs(S,INF);
return num;
} inline bool check(int num)
{
memset(fir,,sizeof fir);cnt=;
memset(f,,sizeof f);
for(int i=;i<=m;i++)
{
if(E[i].c<=num&&E[i].d<=num)f[E[i].a]--,f[E[i].b]++,insert(E[i].b,E[i].a,);
else if(E[i].c<=num)f[E[i].a]--,f[E[i].b]++;
else if(E[i].d<=num)f[E[i].b]--,f[E[i].a]++;
else return ;
}
int sum=;
for(int i=;i<=n;i++)
{
if(f[i]&)return ;
if(f[i]>)insert(S,i,f[i]),sum+=f[i];
else insert(i,T,-f[i]);
}
return sum==dinic();
} int main()
{
n=getint(),m=getint();S=n+,T=S+;
for(int i=;i<=m;i++)E[i].a=getint(),E[i].b=getint(),E[i].c=getint(),E[i].d=getint();
int l=,r=INF;
while(l<r)
{
int mid=(l+r)>>;
if(check(mid))r=mid;
else l=mid+;
}
if(l==INF)printf("NIE\n");
else printf("%d\n",l);
}
BZOJ 2095 Bridges的更多相关文章
- bzoj 2095: [Poi2010]Bridges [混合图欧拉回路]
2095: [Poi2010]Bridges 二分答案,混合图欧拉路判定 一开始想了一个上下界网络流模型,然后发现不用上下界网络流也可以 对于无向边,强制从\(u \rightarrow v\),计算 ...
- BZOJ 2095: [Poi2010]Bridges
2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 869 Solved: 299[Submit][Stat ...
- bzoj 2095 [Poi2010]Bridges 判断欧拉维护,最大流+二分
[Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1448 Solved: 510[Submit][Status][D ...
- BZOJ 2095 [POI2010]Bridges (最大流、欧拉回路)
洛谷上有这题,但是输出方案缺SPJ..(而且我也懒得输出方案了) 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2095 题解: 首先判 ...
- bzoj 2095: [Poi2010]Bridges(二分法+混合图的欧拉回路)
[题意] 给定n点m边的无向图,对于边u,v,从u到v边权为c,从v到u的边权为d,问能够经过每条边一次且仅一次,且最大权值最小的欧拉回路. [思路] 二分答案mid,然后切断权值大于mid的边,原图 ...
- BZOJ.2095.[POI2010]Bridges(最大流ISAP 二分 欧拉回路)
题目链接 最小化最大的一条边,二分答案.然后就变成了给一张无向图定向使其为欧拉回路 二分答案后对于一个位置的两条边可能都保留,即双向边,需要给它定向:可能只保留小的一条,即单向边,不需考虑 如何给它定 ...
- 【刷题】BZOJ 2095 [Poi2010]Bridges
Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛.现在YYD想骑单车从小岛1 ...
- BZOJ 2095 [Poi2010]Bridges (二分+最大流判断混合图的欧拉回路)
题面 nnn个点,mmm条双向边(正向与反向权值不同),求经过最大边权最小的欧拉回路的权值 分析 见 commonc大佬博客 精髓就是通过最大流调整无向边的方向使得所有点的入度等于出度 CODE #i ...
- [原博客] POI系列(5)
正规.严谨.精妙. -POI BZOJ 2213 : [Poi2011]Difference 如果我们每次枚举两个字母最大最小情况时,很容易想到写出代码里注释的样子.这样是26*26*n的,我们发现枚 ...
随机推荐
- 2018-8-10-resharper-跳转到源代码
title author date CreateTime categories resharper 跳转到源代码 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 ...
- Date日期时间相关
最近在封装一个关于时间函数的功能时,竟发现这些最基本的函数都有些生疏,于是进来来总结复习下,巩固自己记忆的同时,希望能帮助到需要的人 首先了解下日期对象相关的方法 var date = new Dat ...
- 选择合适的最短路--hdu3499
[题目链接](http://acm.hdu.edu.cn/showproblem.php?pid=3499) 刚看见题目,哦?不就是个最短路么,来,跑一下dijkstra记录最长路除个二就完事了 ,但 ...
- FPGA之IO信号类型深入理解
在FPGA设计开发中,很多场合会遇到同一根信号既可以是输入信号,又可以是输出信号,即IO类型(Verilog定义成inout). 对于inout型的信号,我们既可以使用FPGA原语来实现,也可以使用V ...
- JVM探秘:垃圾收集算法
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 垃圾收集算法 垃圾收集算法主要有标记-清除算法.复制算法.标记-整理算法.分代收集算法 ...
- 关于面试题:[1, 2, 3].map(parseInt)问题的剖析
一.前言 最近有小伙伴在公号中咨询了胡哥这道面试题,窃以为是比较有意思的一道面试题,于此分享给各位小伙伴.先把答案给了各位,和你理解的一样吗?! [1, 2, 3].map(parseInt) // ...
- 03_input type="number" 输入允许小数点后两位
<input type="number" min="0" max="100" step="0.01"/> & ...
- Java线程池学习总结
一 使用线程池的好处 池化技术相比大家已经屡见不鲜了,线程池.数据库连接池.Http 连接池等等都是对这个思想的应用.池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率. 线程池提供了 ...
- HashMap,HashTable 区别,实现原理。
HashMap是HashTable 的轻量级,非线程安全的,都是实现了map接口 区别:hashmap 允许空键值对的存在,非线程安全,效率高于hashtable,因为hashtable 是synch ...
- 【转】离散傅里叶变换-DFT(FFT)基础
转:https://blog.csdn.net/zhangxz259/article/details/81627341 什么是离散傅里叶变换 matlab例子 本文是从最基础的知识开始讲解,力求用最通 ...