好题\(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. 自定义AuthorizeFilter

    using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization.Infrastructure; u ...

  2. MySQL性能测试调优

    MySQL性能测试调优 操作系统 基本操作 查看磁盘分区mount选项 $ mount 永久修改分区mount选项(系统重启后生效) 修改文件 /etc/fstab 中对应分区的mount optio ...

  3. cocos creator按钮点击按钮弹起效果设置方法

    如图所示: 只要设置下button的Transition的属性为Scale即可,参数自己调整下.

  4. 铰链joints

    Fixed Joint原理像阶层里的父子结构.关节会将对象锁在一个世界坐标或者锁在一个连接的刚体. 固定关节可以设定断裂力道(Break Farce)和断裂扭力(Break torque),破坏关节所 ...

  5. Typora数学公式

    LaTeX编辑数学公式基本语法元素 LaTeX中的数学模式有两种形式: inline 和 display. 前者是指在正文插入行间数学公式,后者独立排列,可以有或没有编号. 行间公式(inline) ...

  6. mysql数据库的多实例与主从同步。

    1.MySQL的多实例: 多实例的特点:能够有效地利用服务器的资源,节约服务器的资源 MySQL多实例的配置有两种,第一是使用一个配置文件,这种方法不推荐使用,容易出错:第二种是用多个配置文件,这种方 ...

  7. dubbo spring 的使用

    1:项目的架构,本项目使用的maven,分为三个模块. api 为接口 , server 为服务端   consumer 为调用端 2:api的模块结构 该模块主要是定义接口和实体.没什么具体介绍的. ...

  8. 爬虫请求库 requests

    requests模块   阅读目录 一 介绍 二 基于GET请求 三 基于POST请求 四 响应Response 五 高级用法 一 介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到 ...

  9. inotify文件监控

    参考:xxxx /*************************************************************************\* Copyright (C) M ...

  10. Vue 前后端分离系统中遇到跨域问题

    https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS I  Your application is running ...