题意

一个 \(n\) 个点 \(m\) 条边的图,每条边双向都有权值(可能不一样)。求从 1 开始,经过所有点,经过所有边一次且仅一次(即一定要经过这条边的某个方向)回到 1 的路径上权值最大的最小是多少。\(n\le 1000,m\le 2000\) 。

分析

显然二分答案,判定是否存在欧拉回路。

欧拉回路的判定用网络流方法。

若是一个有向图,存在欧拉欧拉回路的充要条件是每个点入度等于出度。但这是一个混合图,含有无向边,所以我们要看看无向边走哪个方向,使得每个点的入度等于出度。

对于一条无向边,任意定向,先判断每个点的入度出度之差是否是偶数。若不是,那么无论如何更改方向都不能满足条件。若是偶数,这实际上就告诉我们,每个点有多少入度或者出度需要更改。

设 \(d_x\) 为 \(x\) 点的入度减出度,那么若 \(d_x>0\) ,向汇点连 \(\frac{d_x}{2}\) 的边,否则从源点连 \(\frac{|d_x|}{2}\) 的边。对于任意定向的无向边,给 1 的容量。

考虑这个网络上的一条增广路,它的含义是把这个路径上的边全部反向。注意,这只影响了开头的点和末尾的点的入度与出度关系。具体来说,起始点的入度加一,出度减一;末尾点的入度减一,出度加一。若源点出边满流,就说明,每个点的不合法出度已经被全部更改完了,那么每个点的不合法出度也相应地更改完了。也就是说,原来任意定向的边有 1 的流量,那么把这条边反过来,这样构造的新图是满足每个点的入度等于出度的,即存在欧拉回路。

复杂度为 \(O(n^2m\log w)\) 。

UPD: 这题的可二分性有待讨论,搞不好这题是错的。

代码

#include<bits/stdc++.h>
#define M(x) memset(x,0,sizeof x)
using namespace std;
inline char nchar() {
static const int bufl=1<<20;
static char buf[bufl],*a,*b;
return a==b && (b=(a=buf)+fread(buf,1,bufl,stdin),a==b)?EOF:*a++;
}
inline int read() {
int x=0,f=1;
char c=nchar();
for (;!isdigit(c);c=nchar()) if (c=='-') f=-1;
for (;isdigit(c);c=nchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=1e3+10;
const int maxm=4e3+10;
template<typename T> inline void Max(T &x,T y) {x=max(x,y);}
int n,m,f[maxn],all,ind[maxn],oud[maxn];
int find(int x) {return f[x]==x?x:f[x]=find(f[x]);}
struct bian {
int x,y,a,b;
} b[maxm];
struct some {
int x,y;
bool bi; // true: undir; false: dir
} a[maxm];
namespace graph {
struct edge {
int v,w,nxt;
} e[maxm];
int h[maxn],tot,que[maxn],ql,qr,d[maxn];
inline void clear() {
memset(h,-1,sizeof h);
tot=1;
}
inline void add(int x,int y,int w) {
e[++tot]=(edge){y,w,h[x]};
h[x]=tot;
e[++tot]=(edge){x,0,h[y]};
h[y]=tot;
}
inline bool bfs(int s,int t) {
memset(d,0,sizeof d);
d[que[ql=qr=1]=s]=1;
while (ql<=qr) {
int x=que[ql++];
for (int i=h[x],v=e[i].v;i;i=e[i].nxt,v=e[i].v) if (e[i].w && !d[v]) d[que[++qr]=v]=d[x]+1;
}
return d[t];
}
int dfs(int x,int t,int mi) {
if (x==t) return mi;
int flow=0;
for (int i=h[x],v=e[i].v;i;i=e[i].nxt,v=e[i].v) if (e[i].w && d[v]==d[x]+1) {
int tmp=dfs(v,t,min(mi,e[i].w));
if (!tmp) {d[v]=0;continue;}
e[i].w-=tmp,e[i^1].w+=tmp,mi-=tmp,flow+=tmp;
if (!mi) break;
}
return flow;
}
inline int maxflow(int s,int t) {
int ret=0;
while (bfs(s,t)) ret+=dfs(s,t,INT_MAX);
return ret;
}
}
inline bool check() {
M(ind),M(oud);
for (int i=1;i<=all;++i) ++ind[a[i].y],++oud[a[i].x];
for (int i=1;i<=n;++i) if ((ind[i]-=oud[i])&1) return false; else ind[i]>>=1;
int S=0,T=n+1,sm=0;
graph::clear();
for (int i=1;i<=all;++i) if (a[i].bi) graph::add(a[i].x,a[i].y,1);
for (int i=1;i<=n;++i) if (ind[i]>0) graph::add(i,T,ind[i]); else if (ind[i]<0) graph::add(S,i,-ind[i]),sm-=ind[i];
int flow=graph::maxflow(S,T);
return flow==sm;
}
inline bool ok(int mx) {
for (int i=1;i<=n;++i) f[i]=i;
int cnt=n;
for (int i=1;i<=m;++i) if (b[i].a<=mx || b[i].b<=mx) {
int fx=find(b[i].x),fy=find(b[i].y);
if (fx!=fy) f[fx]=fy,--cnt;
}
if (cnt>1) return false;
all=0;
for (int i=1;i<=m;++i) if (b[i].a<=mx && b[i].b<=mx) a[++all]=(some){b[i].x,b[i].y,true}; else {
if (b[i].a<=mx) a[++all]=(some){b[i].x,b[i].y,false};
if (b[i].b<=mx) a[++all]=(some){b[i].y,b[i].x,false};
}
return check();
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
int l=1,r=0,ans;
n=read(),m=read();
for (int i=1;i<=m;++i) b[i].x=read(),b[i].y=read(),b[i].a=read(),b[i].b=read(),Max(r,max(b[i].a,b[i].b));
while (l<=r) {
int mid=l+r>>1;
if (ok(mid)) ans=mid,r=mid-1; else l=mid+1;
}
ans?printf("%d\n",ans):puts("NIE");
return 0;
}

bzoj2095-Bridge的更多相关文章

  1. 【BZOJ-2095】Bridge 最大流 + 混合图欧拉回路 + 二分

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

  2. 【BZOJ2095】【POI2010】Bridge 网络流

    题目大意 ​ 给你一个无向图,每条边的两个方向的边权可能不同.要求找出一条欧拉回路使得路径上的边权的最大值最小.无解输出"NIE". \(2\leq n\leq 1000,1\le ...

  3. 【BZOJ2095】 Bridge

    Time Limit: 1000 ms   Memory Limit: 128 MB Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个 ...

  4. PHP设计模式(八)桥接模式(Bridge For PHP)

    一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 二.案例 1.模拟毛笔(转) 需求:现在需要准备三种粗细(大中小),并且有五种颜色的比 如果使用蜡 ...

  5. Configure a bridge interface over a VLAN tagged bonded interface

    SOLUTION VERIFIED February 5 2014 KB340153 Environment Red Hat Enterprise Linux 6 (All Versions) Red ...

  6. Create a bridge using a tagged vlan (8021.q) interface

    SOLUTION VERIFIED April 27 2013 KB26727 Environment Red Hat Enterprise Linux 5 Red Hat Enterprise Li ...

  7. Configure bridge on a team interface using NetworkManager in RHEL 7

    SOLUTION IN PROGRESS February 29 2016 KB2181361 environment Red Hat Enterprise Linux 7 Teaming,Bridg ...

  8. 理解 neutron(15):Neutron linux-bridge-agent 创建 linux bridge 的简要过程

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  9. KVM 虚拟机联网方式:NAT 和 Bridge

    KVM 客户机网络连接有两种方式: 用户网络(User Networking):让虚拟机访问主机.互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整.NA ...

  10. 桥接模式/bridge模式/对象结构型

    意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 动机 当一个抽象类有多个实现时,通常用继承来协调它们.但是继承机制将抽象和实现固定,难以对抽象部分和实现部分独立地进行修改.扩充和重用. ...

随机推荐

  1. FileCopy方法

    复制文件. 语法 FileCopy源,目标 FileCopy 语句语法包含以下命名参数: 部分 说明 source 必需. 指定要复制的文件的名称的字符串表达式. _源_可能包含目录或文件夹,和驱动器 ...

  2. Float浮点数的使用和条件

    在这里简单的说一下,我对浮点数的理解,可能说的比较浅,老师也没有说,只是略微的提了一下,完全是我自己个人的理解. 我觉得float浮点数的用法和int的用法有些雷同,浮点数用于计算小数点单位,我们先可 ...

  3. centos7上的postgresql10安装和配置

    安装数据库 安装参考官方文档:https://www.postgresql.org/download/linux/redhat/ 1.Install the repository RPM: yum i ...

  4. 2018Java年底总结

    一年又过去了,这是我的第二年的JAVA开发,总感觉有很多想说的,可惜语言组织能力着实一般,以下列举一些今年的总结. 1.首先告诫一下新入行或者新入职经验不多的小伙伴,写sql的时候根据业务能单表就单表 ...

  5. c#随机生成中文姓名

    为什么要自己写这个生成器呢?大家应该都有过为测试数据发愁的时候,我就是出于这样的原因. 尽管本次代码很少,但是还会有后续的生成器分享出来. 我代码底子还不是很好,希望各位同道能够发表意见,同是也欢迎大 ...

  6. MapReduce任务学习系列

    首先放一张官方图片,大致了解下整个MapReduce的处理过程. 抛出如下疑问: 1.MapReduce的基本原理是什么?即利用什么机制来实现的任务拆分处理? 2.MapReduce任务执行过程是什么 ...

  7. 从零开始的Python学习Episode 19——面向对象(2)

    面向对象之继承 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称 为基类或超类,新建的类称为派生类或子类. 子类会“”遗传”父类的属性,从而解决代码重用问 ...

  8. Node of C++ Linker.

    code is nothing without data. data segment - the program memory storing initialized global variable. ...

  9. 测试效率 timeit cProfile

    timeit使用 def f1(lIn): l1 = sorted(lIn) # O(nlogn) C语言的 l2 = [i for i in l1 if i<0.5] # O(n) retur ...

  10. Django_rest_framework_渲染器/解析器/路由控制/分页

    目录 渲染器 解析器 路由控制 分页 渲染器 简介 什么是渲染器 根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件. 渲染器的作用 序列化.友好的展示数据 渲染器配置 首先要在set ...