好题\(Q\omega Q\)

我们考虑这个东西要求最大值最小,显然一眼二分答案对吧.

问题在于如何\(check\),我们二分答案之后把问题转换成了混合图如何求欧拉回路.

考虑欧拉回路的性质,每一个点的入度要\(=\)出度.

但是存在无向边,我们先随便让它选择一个方向,然后连一条反向边,容量为1.

这样子我们考虑选这样子一条边意味着让一个点的入度与出度的差 减少/增加 2.

然后直接跑最大流判断是否满流即可.

/*
mail: mleautomaton@foxmail.com
author: MLEAutoMaton
This Code is made by MLEAutoMaton
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi(){
int f=1,sum=0;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
return f*sum;
}
const int N=2010,Inf=1e9+10;
int n,m,front[N],cnt,dep[N],cur[N],s,t,d[N];queue<int>Q;
struct node{int to,nxt,w;}e[N*20];
void Add(int u,int v,int w){
e[cnt]=(node){v,front[u],w};front[u]=cnt++;
e[cnt]=(node){u,front[v],0};front[v]=cnt++;
}
struct edge{int u,v,c,d;}edg[N];
bool bfs(){
Q.push(s);memset(dep,0,sizeof(dep));dep[s]=1;
while(!Q.empty()){
int u=Q.front();Q.pop();
for(int i=front[u];~i;i=e[i].nxt){
int v=e[i].to;
if(!dep[v] && e[i].w){
dep[v]=dep[u]+1;Q.push(v);
}
}
}
return dep[t];
}
int dfs(int u,int flow){
if(u==t || !flow)return flow;
for(int &i=cur[u];~i;i=e[i].nxt){
int v=e[i].to;
if(dep[v]==dep[u]+1 && e[i].w){
int di=dfs(v,min(e[i].w,flow));
if(di){
e[i].w-=di;e[i^1].w+=di;return di;
}
else dep[v]=0;
}
}
return 0;
}
int Dinic(){
int flow=0;
while(bfs()){
for(int i=s;i<=t;i++)cur[i]=front[i];
while(int d=dfs(s,Inf))flow+=d;
}
return flow;
}
int build(int mid){
memset(front,-1,sizeof(front));cnt=0;
memset(d,0,sizeof(d));int tot=0;s=0;t=n+1;
for(int i=1;i<=m;i++){
int C=edg[i].c,D=edg[i].d;
if(C<=mid){d[edg[i].u]--;d[edg[i].v]++;}
if(D<=mid)Add(edg[i].v,edg[i].u,1);
}
for(int i=1;i<=n;i++)
if(d[i]&1)return 0;
for(int i=1;i<=n;i++)
if(d[i]>0)Add(s,i,d[i]/2),tot+=d[i]/2;
else Add(i,t,-d[i]/2);
return tot+1;
}
bool check(int mid){
int tot=build(mid);
if(!tot)return false;
tot--;
return Dinic()==tot;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
#endif
n=gi();m=gi();int l=Inf,r=-Inf;
for(int i=1;i<=m;i++){
edg[i].u=gi(),edg[i].v=gi(),edg[i].c=gi(),edg[i].d=gi();
if(edg[i].c>edg[i].d)
swap(edg[i].u,edg[i].v),swap(edg[i].c,edg[i].d);
l=min(l,edg[i].c);r=max(r,edg[i].d);
}
int ret=0;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)){r=mid-1;ret=mid;}
else l=mid+1;
}
if(ret)printf("%d\n",ret);
else puts("NIE");
return 0;
}

POI2010 Bridges的更多相关文章

  1. bzoj 2095: [Poi2010]Bridges [混合图欧拉回路]

    2095: [Poi2010]Bridges 二分答案,混合图欧拉路判定 一开始想了一个上下界网络流模型,然后发现不用上下界网络流也可以 对于无向边,强制从\(u \rightarrow v\),计算 ...

  2. [BZOJ2095][Poi2010]Bridges 最大流(混合图欧拉回路)

    2095: [Poi2010]Bridges Time Limit: 10 Sec  Memory Limit: 259 MB Description YYD为了减肥,他来到了瘦海,这是一个巨大的海, ...

  3. 【BZOJ2095】[Poi2010]Bridges 动态加边网络流

    [BZOJ2095][Poi2010]Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个 ...

  4. BZOJ2095 POI2010 Bridges 【二分+混合图欧拉回路】

    BZOJ2095 POI2010 Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛 ...

  5. bzoj 2095 [Poi2010]Bridges 判断欧拉维护,最大流+二分

    [Poi2010]Bridges Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1448  Solved: 510[Submit][Status][D ...

  6. BZOJ 2095: [Poi2010]Bridges

    2095: [Poi2010]Bridges Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 869  Solved: 299[Submit][Stat ...

  7. [BZOJ2095][Poi2010]Bridges 二分+网络流

    2095: [Poi2010]Bridges Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1187  Solved: 408[Submit][Sta ...

  8. 【BZOJ2095】[Poi2010]Bridges

    [BZOJ2095][Poi2010]Bridges 题面 darkbzoj 题解 首先可以想到二分答案,那么我们就是要求我们新图中给所有边定向是否存在欧拉回路. 而有向图存在欧拉回路的充要条件为所有 ...

  9. BZOJ2095 [Poi2010]Bridges

    首先二分答案...然后这张图变成了有一些有向边,有一些无向边 然后就是混合图欧拉回路的判断 我们知道如果是有向图,它存在欧拉回路的等价条件是所有点的出度等于入度 对于混合图...先不管有向边,把无向边 ...

  10. bzoj 2095: [Poi2010]Bridges(二分法+混合图的欧拉回路)

    [题意] 给定n点m边的无向图,对于边u,v,从u到v边权为c,从v到u的边权为d,问能够经过每条边一次且仅一次,且最大权值最小的欧拉回路. [思路] 二分答案mid,然后切断权值大于mid的边,原图 ...

随机推荐

  1. 解决:error LNK1169: 找到一个或多个多重定义的符号

    每一个c++项目中可以包含多个cpp文件和.h文件,不过只能有而且必须有一个cpp文件中包含main函数,否则就会报错.所以在一个c++项目中不能单独运行一个cpp文件,只能运行一个项目.如果你想一个 ...

  2. Scrapy 安装与使用

    Scrapy的安装: 当前环境win10,python_3.6.4,64bit.在命令提示符窗口运行pip install Scrapy,出现以下结果: building 'twisted.test. ...

  3. js循环修改数组属性key值

    var keyMap = { deviceUid: "id", deviceType: "typeName", deviceCode: "code&q ...

  4. Java 之 ObjectOutputStream 类

    ObjectOutputStream 类 1.概述 java.io.ObjectOutputStream extends OutputStream ObjectOutputStream:对象的序列化流 ...

  5. K2 BPM_当K2遇上医药,用流程打通企业的任督二脉_业务流程管理系统

    据调查,如今仍有60%的医药企业,存在合规经营和利润下降的困扰,在“研”.“产”.“供”.“销”的运营过程中,时时伴随着严苛的管理政策和法规.如何加强企业跨部门.跨组织.跨业务线的执行能力,始终是管理 ...

  6. stm32内联汇编

    首先,先看一下mdk下的混合编程的基本方法: 使用如上方法就可以进行混合编程了. 但是要特殊注意一点,个人感觉这个是直接调用一个代码段,并非一个函数,因为他不会保护调用这个代码段之前的现场.比如: 在 ...

  7. REST,以及RESTful的讲解

    详见:https://blog.csdn.net/qq_21383435/article/details/80032375 1.传统下的API接口对比规则概念REST 系统的特征演化优点&缺点 ...

  8. @Transactional 同一个类中无事务方法a()内部调用有事务方法b()的问题

    https://blog.csdn.net/u010235716/article/details/90171802 1. 事务的4种特性       序号 参数 含义1 原子性(Atomicity) ...

  9. Python标准库3.4.3-urllib.request-21.6

    21.6. urllib.request — Extensible library for opening URLs 翻译:Z.F. The urllib.request module defines ...

  10. java--分析简单java类与反射的联系

    分析简单java类与反射的联系 web对反射的操作支持 在JSP之中有一种技术--javaBean.而且在jsp里面也配套有相应的操作方式,javaBean的核心在于简单java类,于是下面演示此操作 ...