BZOJ2095:[POI2010]Bridges(最大流,欧拉图)
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
1 2 2 4
2 3 3 4
3 4 4 4
4 1 5 4

Sample Output
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(最大流,欧拉图)的更多相关文章
- [BZOJ2095][Poi2010]Bridges 最大流(混合图欧拉回路)
2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MB Description YYD为了减肥,他来到了瘦海,这是一个巨大的海, ...
- BZOJ2095 POI2010 Bridges 【二分+混合图欧拉回路】
BZOJ2095 POI2010 Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛 ...
- [BZOJ2095][Poi2010]Bridges 二分+网络流
2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1187 Solved: 408[Submit][Sta ...
- bzoj2095: [Poi2010]Bridges(二分+混合图求欧拉回路)
传送门 这篇题解讲的真吼->这里 首先我们可以二分一个答案,然后把所有权值小于这个答案的都加入图中 那么问题就转化为一张混合图(既有有向边又有无向边)中是否存在欧拉回路 首先 无向图存在欧拉回路 ...
- BZOJ2095 [Poi2010]Bridges
首先二分答案...然后这张图变成了有一些有向边,有一些无向边 然后就是混合图欧拉回路的判断 我们知道如果是有向图,它存在欧拉回路的等价条件是所有点的出度等于入度 对于混合图...先不管有向边,把无向边 ...
- BZOJ.2095.[POI2010]Bridges(最大流ISAP 二分 欧拉回路)
题目链接 最小化最大的一条边,二分答案.然后就变成了给一张无向图定向使其为欧拉回路 二分答案后对于一个位置的两条边可能都保留,即双向边,需要给它定向:可能只保留小的一条,即单向边,不需考虑 如何给它定 ...
- [Poi2010]Bridges 最大流+二分答案 判定混合图欧拉回路
https://darkbzoj.cf/problem/2095 bzoj 相同的题挂了,这个oj可以写. 题目就是要我们找一条欧拉回路(每个桥经过一次就好,不管方向),使得这条回路上权值最大的尽量小 ...
- BZOJ 2095 [POI2010]Bridges (最大流、欧拉回路)
洛谷上有这题,但是输出方案缺SPJ..(而且我也懒得输出方案了) 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2095 题解: 首先判 ...
- bzoj千题计划228:bzoj2095: [Poi2010]Bridges
http://www.lydsy.com/JudgeOnline/problem.php?id=2095 二分答案,判断是否存在混合图的欧拉回路 如果只有一个方向的风力<=mid,这条边就是单向 ...
随机推荐
- 学习Memcached:2基本应用之控制台使用
1.首先新建一个控制台应用. 2.将下载好需要引用的Memcached的Dll导入进来. 3.前期准备工作就结束了,其实很简单,memcache的配置使用是挺简单.下面就是写代码了. using Me ...
- [android] 新闻客户端实现左侧导航点击切换
设置主布局文件,为根布局设置一个id,作为内容区 给ListView的条目设置点击事件,setOnItemClickListener()方法,参数:上下文 当前的Fragment实现OnItemCli ...
- Eclipse启动tomcat后404错误
题描述 在eclipse部署web项目后,发现tomcat可以启动,但是访问http://localhost:8080地址报404错误.而不使用eclipse启动tomcat,直接通过通过tomcat ...
- 设计模式-原型(prototype)
一.概念 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 二.模式动机 当已有一个对像,暂且称之为原型对象,需要一个新的对像,该对像和已有的原型对像具有相同的类型,且里面的属性大部分 ...
- protocol buffer c#
第一.打开vs中的Nuget
- 阿里云数据库配置学习笔记(二):下载并配置MySQL数据库
参考资料:阿里云官方文档 2018-02-20 一.MySQL数据库的下载 在Ubuntu环境下安装MySQL数据库十分简单 在命令行中输入 sudo apt-get update(更新软件源,预防出 ...
- POJ1236(KB9-A 强连通分量)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19326 Accepted: 75 ...
- 让你彻底搞懂JS中复杂运算符==
让你彻底搞懂JS中复杂运算符== 大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容易让人犯错,从而成为JavaScript中“最糟糕的特性”之一. 在仔细阅读了ECMA ...
- Mysql实现级联操作(级联更新、级联删除)
一.首先创建两张表stu,sc create table stu( sid int UNSIGNED primary key auto_increment, name ) not null) TYPE ...
- 使用ThinkPHP实现生成缩略图及显示
首先了解父类Image.class.php(ThinkPHP/Library/Think/Image.class.php)中的一些函数 1:open() 打开被处理的图片 2:thumb() 生成缩略 ...