BZOJ2095:[POI2010]Bridges(最大流,欧拉图)

时间:2022-09-20 17:30:54

Description

YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛。现在YYD想骑单车从小岛1出发,骑过每一座桥,到达每一个小岛,然后回到小岛1。霸中同学为了让YYD减肥成功,召唤了大风,由于是海上,风变得十分大,经过每一座桥都有不可避免的风阻碍YYD,YYD十分ddt,于是用泡芙贿赂了你,希望你能帮他找出一条承受的最大风力最小的路线。

Input

输入:第一行为两个用空格隔开的整数n(2<=n<=1000),m(1<=m<=2000),接下来读入m行由空格隔开的4个整数a,b(1<=a,b<=n,a<>b),c,d(1<=c,d<=1000),表示第i+1行第i座桥连接小岛a和b,从a到b承受的风力为c,从b到a承受的风力为d。

Output

输出:如果无法完成减肥计划,则输出NIE,否则第一行输出承受风力的最大值(要使它最小)

Sample Input

4 4
1 2 2 4
2 3 3 4
3 4 4 4
4 1 5 4
BZOJ2095:[POI2010]Bridges(最大流,欧拉图)

Sample Output

4

HINT

注意:通过桥为欧拉回路

Solution

首先二分一下答案,然后问题就变成了求混合图的欧拉回路。

这是网络流比较经典的一个问题,详细做法可以看这篇博客

Code

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<queue>
#define N (5009)
using namespace std; struct Edge{int to,next,flow;}edge[N<<];
int n,m,a[N],b[N],c[N],d[N];
int s,e=,tot,Depth[N],Deg[N];
int head[N],num_edge;
queue<int>q; void add(int u,int v,int l)
{
edge[++num_edge].to=v;
edge[num_edge].next=head[u];
edge[num_edge].flow=l;
head[u]=num_edge;
} int DFS(int x,int low)
{
if (x==e || !low) return low;
int f=;
for (int i=head[x]; i; i=edge[i].next)
if (Depth[edge[i].to]==Depth[x]+)
{
int Min=DFS(edge[i].to,min(low,edge[i].flow));
edge[i].flow-=Min;
edge[((i-)^)+].flow+=Min;
f+=Min; low-=Min;
if (!low) break;
}
if (!f) Depth[x]=-;
return f;
} bool BFS(int s,int e)
{
memset(Depth,,sizeof(Depth));
Depth[s]=; q.push(s);
while (!q.empty())
{
int x=q.front(); q.pop();
for (int i=head[x]; i; i=edge[i].next)
if (!Depth[edge[i].to] && edge[i].flow)
{
Depth[edge[i].to]=Depth[x]+;
q.push(edge[i].to);
}
}
return Depth[e];
} int Dinic(int s,int e)
{
int ans=;
while (BFS(s,e)) ans+=DFS(s,0x7fffffff);
return ans;
} bool check(int lim)
{
memset(head,,sizeof(head));
num_edge=; for (int i=; i<=m; ++i)
{
if (c[i]>lim) return ;
if (d[i]<=lim) add(a[i],b[i],), add(b[i],a[i],);
}
for (int i=; i<=n; ++i)
{
if (Deg[i]<) add(s,i,-Deg[i]/), add(i,s,);
if (Deg[i]>) add(i,e,Deg[i]/), add(e,i,);
}
return Dinic(s,e)==tot/;
} int main()
{
scanf("%d%d",&n,&m);
for (int i=; i<=m; ++i)
{
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
if (c[i]>d[i]) swap(a[i],b[i]), swap(c[i],d[i]);
Deg[a[i]]--, Deg[b[i]]++;
}
for (int i=; i<=n; ++i)
if (Deg[i]%) {puts("NIE"); return ;}
else tot+=abs(Deg[i]/);
int l=,r=,ans=-;
while (l<=r)
{
int mid=(l+r)>>;
if (check(mid)) ans=mid, r=mid-;
else l=mid+;
}
printf("%d\n",ans);
}

BZOJ2095:[POI2010]Bridges(最大流,欧拉图)的更多相关文章

  1. &lbrack;BZOJ2095&rsqb;&lbrack;Poi2010&rsqb;Bridges 最大流(混合图欧拉回路)

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

  2. BZOJ2095 POI2010 Bridges 【二分&plus;混合图欧拉回路】

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

  3. &lbrack;BZOJ2095&rsqb;&lbrack;Poi2010&rsqb;Bridges 二分&plus;网络流

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

  4. bzoj2095&colon; &lbrack;Poi2010&rsqb;Bridges(二分&plus;混合图求欧拉回路)

    传送门 这篇题解讲的真吼->这里 首先我们可以二分一个答案,然后把所有权值小于这个答案的都加入图中 那么问题就转化为一张混合图(既有有向边又有无向边)中是否存在欧拉回路 首先 无向图存在欧拉回路 ...

  5. BZOJ2095 &lbrack;Poi2010&rsqb;Bridges

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

  6. BZOJ&period;2095&period;&lbrack;POI2010&rsqb;Bridges&lpar;最大流ISAP 二分 欧拉回路&rpar;

    题目链接 最小化最大的一条边,二分答案.然后就变成了给一张无向图定向使其为欧拉回路 二分答案后对于一个位置的两条边可能都保留,即双向边,需要给它定向:可能只保留小的一条,即单向边,不需考虑 如何给它定 ...

  7. &lbrack;Poi2010&rsqb;Bridges 最大流&plus;二分答案 判定混合图欧拉回路

    https://darkbzoj.cf/problem/2095 bzoj 相同的题挂了,这个oj可以写. 题目就是要我们找一条欧拉回路(每个桥经过一次就好,不管方向),使得这条回路上权值最大的尽量小 ...

  8. BZOJ 2095 &lbrack;POI2010&rsqb;Bridges &lpar;最大流、欧拉回路&rpar;

    洛谷上有这题,但是输出方案缺SPJ..(而且我也懒得输出方案了) 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2095 题解: 首先判 ...

  9. bzoj千题计划228:bzoj2095&colon; &lbrack;Poi2010&rsqb;Bridges

    http://www.lydsy.com/JudgeOnline/problem.php?id=2095 二分答案,判断是否存在混合图的欧拉回路 如果只有一个方向的风力<=mid,这条边就是单向 ...

随机推荐

  1. 使用非Web方式从CA申请证书

    背景介绍:关于从CA申请证书这点事,网上的那些教程基本都是让我们通过访问https://server/certsrv这样的网页来操作的,我一直希望不依赖IIS就把这事干了,于是就有了下面的文章. 1. ...

  2. 使用的 SQL Server 版本不支持数据类型&OpenCurlyDoubleQuote;datetime2”&period;

    错误原因,在使用ado.net entity的时候,entity使用的数据库是sqlserver 2008, 但后来实际使用中使用的数据库是sqlserver 2005, 使用的 SQL Server ...

  3. 翻译qmake文档&lpar;一&rpar; qmake指南和概述

    翻译qmake文档 目录 英文文档连接: http://qt-project.org/doc/qt-5/qmake-manual.html http://qt-project.org/doc/qt-5 ...

  4. 安装numpy&plus;mkl

    引子: 运行from sklearn.dataset import load_iris 时提示: Traceback (most recent call last): File "F:/gi ...

  5. windows 下Python import 导入自定义模块

    周末在家研究这个东西,则找到解决方案. 费话少说,上代码 #定义一个自定义的函数,如下 #函数的名称必须是字母和数字的组合,不能用数字开头 #函数名后用小括号括住入参,可以用逗号分隔多个 #如果有返回 ...

  6. &lbrack;BZOJ 2821&rsqb; 作诗&lpar;Poetize&rpar; 【分块】

    题目链接:BZOJ - 2821 题目分析 因为强制在线了,所以无法用莫队..可以使用分块来做. 做法是,将 n 个数分成 n/x 个块,每个块大小为 x .先预处理出 f[i][j] ,表示从第 i ...

  7. mongoDb c driver

    1,yum dependencies Centos,RHEL Fedora: $ sudo yum install git gcc automake autoconf libtool Debian: ...

  8. swift学习笔记&lpar;七&rpar;自己主动引用计数

    与Object-c一样,swift使用自己主动引用计数来跟踪并管理应用使用的内存.当实例不再被使用时,及retainCount=0时,会自己主动释放是理所占用的内存空间. 注:引用计数仅适用于类的实例 ...

  9. 在vc正在使用xtremetoolkit接口库-----使用简单的控制

    首先,我们需要在StdAfx.h增加头文件: #include "XTToolkitPro.h" #include "XTPResource.h" 在test. ...

  10. 201521123109《java程序设计》第八周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1 ...