[BZOJ2095][Poi2010]Bridges 二分+网络流
2095: [Poi2010]Bridges
Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 1187 Solved: 408
[Submit][Status][Discuss]
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
注意:通过桥为欧拉回路
首先我们二分答案,之后我们用可行边建图,发现是混合图的欧拉回路问题,用网络流解决。
对于无向边,我们给它随意定向,之后看每个点的入度出度之差的绝对值tmp是否为2的倍数。
对于入度大于出度的点,我们从这个点向汇点连一条容量为tmp/2的边。
对于入度小于出度的点,我们从源点向这个点连一条容量为tmp/2的边。
对于每一条无向边,我们沿定的向连一条容量为1的边。
查询是否满流。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m;
int head[],cnt;
struct data {
int to,next,w;
}e[];
void add(int u,int v,int c){e[cnt].to=v;e[cnt].next=head[u];e[cnt].w=c;head[u]=cnt++;}
struct data1 {
int a,b,c,d;
}t[];
int ru[],cu[];
int q[];
bool vis[];
int dis[];
bool bfs() {
memset(dis,-,sizeof(dis));
int h=,t=;
q[h]=;
vis[]=;
dis[]=;
while(h!=t) {
int now=q[h];h++;vis[now]=;if(h==) h=;
for(int i=head[now];i>=;i=e[i].next) {
int to=e[i].to;
if(e[i].w>&&dis[to]<) {
dis[to]=dis[now]+;
if(!vis[to]){
vis[to]=;
q[t++]=to;if(t==)t=;
}
}
}
}
return dis[n+]!=-;
}
int dfs(int now,int a) {
if(now==n+||a==) return a;
int flow=,f;
for(int i=head[now];i>=;i=e[i].next) {
int to=e[i].to;
if(dis[to]==dis[now]+&&e[i].w>) {
f=dfs(to,min(a,e[i].w));
e[i].w-=f;
e[i^].w+=f;
flow+=f;
a-=f;
if(a==) break;
}
}
if(!flow) dis[now]=-;
return flow;
}
bool check(int mid) {
cnt=;
memset(head,-,sizeof(head));
memset(ru,,sizeof(ru));
memset(cu,,sizeof(cu));
for(int i=;i<=m;i++) {
if(t[i].c<=mid) {
if(t[i].d<=mid) {
add(t[i].a,t[i].b,);
add(t[i].b,t[i].a,);
cu[t[i].a]++;ru[t[i].b]++;
}
else {cu[t[i].a]++;ru[t[i].b]++;}
}
else if(t[i].d<=mid) {ru[t[i].a]++;cu[t[i].b]++;}
else return ;
}
int sum=;
for(int i=;i<=n;i++) {
if(abs(ru[i]-cu[i])&) return ;
int tmp=abs(ru[i]-cu[i]);
if(ru[i]<cu[i]) {add(,i,tmp/);add(i,,);}
else if(ru[i]>cu[i]) {sum+=tmp/;add(i,n+,tmp/);add(n+,i,);}
}
int ans=;
while(bfs()){ans+=dfs(,);}
return ans==sum;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++) {
scanf("%d%d%d%d",&t[i].a,&t[i].b,&t[i].c,&t[i].d);
}
int l=,r=;
while(l<=r) {
int mid=(l+r)>>;
if(check(mid)) r=mid-;
else l=mid+;
}
if(r==) printf("NIE");
else printf("%d",r+);
}
[BZOJ2095][Poi2010]Bridges 二分+网络流的更多相关文章
- BZOJ2095 POI2010 Bridges 【二分+混合图欧拉回路】
BZOJ2095 POI2010 Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛 ...
- [BZOJ2095][Poi2010]Bridges 最大流(混合图欧拉回路)
2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MB Description YYD为了减肥,他来到了瘦海,这是一个巨大的海, ...
- bzoj2095: [Poi2010]Bridges(二分+混合图求欧拉回路)
传送门 这篇题解讲的真吼->这里 首先我们可以二分一个答案,然后把所有权值小于这个答案的都加入图中 那么问题就转化为一张混合图(既有有向边又有无向边)中是否存在欧拉回路 首先 无向图存在欧拉回路 ...
- BZOJ2095 [Poi2010]Bridges
首先二分答案...然后这张图变成了有一些有向边,有一些无向边 然后就是混合图欧拉回路的判断 我们知道如果是有向图,它存在欧拉回路的等价条件是所有点的出度等于入度 对于混合图...先不管有向边,把无向边 ...
- BZOJ2095:[POI2010]Bridges(最大流,欧拉图)
Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛.现在YYD想骑单车从小岛1 ...
- bzoj千题计划228:bzoj2095: [Poi2010]Bridges
http://www.lydsy.com/JudgeOnline/problem.php?id=2095 二分答案,判断是否存在混合图的欧拉回路 如果只有一个方向的风力<=mid,这条边就是单向 ...
- BZOJ 2095 [Poi2010]Bridges (二分+最大流判断混合图的欧拉回路)
题面 nnn个点,mmm条双向边(正向与反向权值不同),求经过最大边权最小的欧拉回路的权值 分析 见 commonc大佬博客 精髓就是通过最大流调整无向边的方向使得所有点的入度等于出度 CODE #i ...
- bzoj 2095: [Poi2010]Bridges [混合图欧拉回路]
2095: [Poi2010]Bridges 二分答案,混合图欧拉路判定 一开始想了一个上下界网络流模型,然后发现不用上下界网络流也可以 对于无向边,强制从\(u \rightarrow v\),计算 ...
- 【BZOJ2095】[Poi2010]Bridges 动态加边网络流
[BZOJ2095][Poi2010]Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个 ...
随机推荐
- 线程间通信(等待,唤醒)&Java中sleep()和wait()比较
1.什么是线程间通信? 多个线程在处理同一资源,但是任务却不同. 生活中栗子:有一堆煤,有2辆车往里面送煤,有2辆车往外拉煤,这个煤就是同一资源,送煤和拉煤就是任务不同. 2.等待/唤醒机制. 涉及的 ...
- 《Cracking the Coding Interview》——第14章:Java——题目4
2014-04-26 19:02 题目:解释下C++里模板和java里泛型的区别? 解法:我很少用java,属于连语法都不过关的程度.所以这个题还真没法详细答,查了些资料以后写了以下几点. 代码: / ...
- Python 高级 I/O 多路复用
Table of Contents 前言 select selectors 结语 参考链接 前言 第一次接触和 I/O 多路复用相关的概念是在书 CSAPP1 的并发编程章节,当时在了解了这个概念后只 ...
- yum源是什么
我们安装软件的时候需要下载软件,将很多软件放在一起就是源.软件安装包的来源. 所以yum源就是软件安装包来源. 如果我们是在线的,他会在网上给你下载安装包,如果是离线的没有网络.那么就只能配置本地的y ...
- Space Shooter 太空射击
1.控制玩家移动 public float speed = 10f; public float xMin = -6.5f; public float xMax = 6.5f; public float ...
- Ubuntu系列问题
一.Ubuntu16.04 intel_rapl : no valid rapl domains found in packge0 echo 'blacklist intel_rapl' >&g ...
- 爬虫:Scrapy11 - Logging
Scrapy 提供了 log 功能.可以通过 scrapy.log 模块使用.当前底层实现使用了 Twisted logging,不过可能在之后会有所变化. log 服务必须通过显式调用 scrapy ...
- Homework-09 二维数组动态显示
思路 主要是把计算的函数由一次跑完全部改成一次一步 主要是把一个3重for循环改为能一步一次的实现 public int nstep(int n){ while((n--)!=0){ //n步长 // ...
- JAVA并发-线程协作
这段时间有点忙,技术博客更新的比较少,今天更新一下相关并发的常用线程协作的类吧. ExecutorService 线程池,用于创造和复用线程,他有几种模式. 我举一个自定义线程池数量的例子如下 Exe ...
- HDU 1171 Big Event in HDU 母函数
欢迎参加——BestCoder周年纪念赛(高质量题目+多重奖励) Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory ...