BZOJ 2095: [Poi2010]Bridges
2095: [Poi2010]Bridges
Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 869 Solved: 299
[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
注意:通过桥为欧拉回路
Source
分析:
最大值最小的问题...
二分答案,然后就转化成了混合图欧拉回路的存在性问题...可以参考POJ 1637
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
#define inf 0x3f3f3f3f
using namespace std; const int maxn=1000+5,maxm=10000+5; int n,m,S,T,tot,Min,Max,in[maxn],out[maxn],vis[maxm];
int cnt,hd[maxn],fl[maxm],to[maxm],pos[maxn],nxt[maxm]; struct M{
int x,y,c,d;
}e[maxm]; inline void add(int x,int y,int s){
fl[cnt]=s;to[cnt]=y;nxt[cnt]=hd[x];hd[x]=cnt++;
fl[cnt]=0;to[cnt]=x;nxt[cnt]=hd[y];hd[y]=cnt++;
} inline bool bfs(void){
memset(pos,-1,sizeof(pos));
int head=0,tail=0,q[maxn];
pos[S]=0;q[0]=S;
while(head<=tail){
int top=q[head++];
for(int i=hd[top];i!=-1;i=nxt[i])
if(pos[to[i]]==-1&&fl[i])
pos[to[i]]=pos[top]+1,q[++tail]=to[i];
}
return pos[T]!=-1;
} inline int find(int v,int f){
if(v==T) return f;
int res=0,t;
for(int i=hd[v];i!=-1&&f>res;i=nxt[i])
if(pos[to[i]]==pos[v]+1&&fl[i])
t=find(to[i],min(fl[i],f-res)),res+=t,fl[i]-=t,fl[i^1]+=t;
if(!res) pos[v]=-1;
return res;
} inline int dinic(void){
int res=0,t;
while(bfs())
while(t=find(S,inf))
res+=t;
return res;
} inline bool check(int val){
cnt=0;tot=0;
memset(in,0,sizeof(in));
memset(hd,-1,sizeof(hd));
memset(out,0,sizeof(out));
memset(vis,0,sizeof(vis));
for(int i=1;i<=m;i++){
if(e[i].c<=val) vis[i]+=1;
if(e[i].d<=val) vis[i]+=2;
}
for(int i=1;i<=m;i++){
if(vis[i]==3)
in[e[i].y]++,out[e[i].x]++,add(e[i].x,e[i].y,1);
else if(vis[i]==1)
in[e[i].y]++,out[e[i].x]++;
else if(vis[i]==2)
in[e[i].x]++,out[e[i].y]++;
}
for(int i=1;i<=n;i++)
if(abs(in[i]-out[i])&1)
return false;
for(int i=1;i<=n;i++)
if(in[i]<out[i])
add(S,i,(out[i]-in[i])/2),tot+=(out[i]-in[i])/2;
else if(in[i]>out[i])
add(i,T,(in[i]-out[i])/2);
if(dinic()==tot)
return true;
return false;
} signed main(void){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
scanf("%d%d",&n,&m);Min=2333;Max=0;S=0,T=n+1;
for(int i=1;i<=m;i++)
scanf("%d%d%d%d",&e[i].x,&e[i].y,&e[i].c,&e[i].d),
Min=min(Min,min(e[i].c,e[i].d)),
Max=max(Max,max(e[i].c,e[i].d));
int l=Min,r=Max,ans=-1;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid))
ans=mid,r=mid-1;
else
l=mid+1;
}
if(ans==-1) puts("NIE");
else printf("%d\n",ans);
return 0;
}
By NeighThorn
BZOJ 2095: [Poi2010]Bridges的更多相关文章
- bzoj 2095: [Poi2010]Bridges [混合图欧拉回路]
2095: [Poi2010]Bridges 二分答案,混合图欧拉路判定 一开始想了一个上下界网络流模型,然后发现不用上下界网络流也可以 对于无向边,强制从\(u \rightarrow v\),计算 ...
- bzoj 2095 [Poi2010]Bridges 判断欧拉维护,最大流+二分
[Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1448 Solved: 510[Submit][Status][D ...
- BZOJ 2095 [POI2010]Bridges (最大流、欧拉回路)
洛谷上有这题,但是输出方案缺SPJ..(而且我也懒得输出方案了) 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2095 题解: 首先判 ...
- bzoj 2095: [Poi2010]Bridges(二分法+混合图的欧拉回路)
[题意] 给定n点m边的无向图,对于边u,v,从u到v边权为c,从v到u的边权为d,问能够经过每条边一次且仅一次,且最大权值最小的欧拉回路. [思路] 二分答案mid,然后切断权值大于mid的边,原图 ...
- BZOJ.2095.[POI2010]Bridges(最大流ISAP 二分 欧拉回路)
题目链接 最小化最大的一条边,二分答案.然后就变成了给一张无向图定向使其为欧拉回路 二分答案后对于一个位置的两条边可能都保留,即双向边,需要给它定向:可能只保留小的一条,即单向边,不需考虑 如何给它定 ...
- 【刷题】BZOJ 2095 [Poi2010]Bridges
Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛.现在YYD想骑单车从小岛1 ...
- BZOJ 2095 [Poi2010]Bridges (二分+最大流判断混合图的欧拉回路)
题面 nnn个点,mmm条双向边(正向与反向权值不同),求经过最大边权最小的欧拉回路的权值 分析 见 commonc大佬博客 精髓就是通过最大流调整无向边的方向使得所有点的入度等于出度 CODE #i ...
- [BZOJ2095][Poi2010]Bridges 最大流(混合图欧拉回路)
2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MB Description YYD为了减肥,他来到了瘦海,这是一个巨大的海, ...
- [BZOJ2095][Poi2010]Bridges 二分+网络流
2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1187 Solved: 408[Submit][Sta ...
随机推荐
- CDH-5.9.2整合spark2
1.编写目的:由于cdh-5.9.2自带spark版本是spark1.6,现需要测试spark2新特性,需要整合spark2, 且spark1.x和spark2.x可以同时存在于cdh中,无需先删除s ...
- Close Java Auto Update in Windows 7 and Later
0. Environment Windows 7JDK 1.6.0_45 1. Steps 1) Enter "JRE/bin" 2) Run javacpl.exe as adm ...
- ExtJs工具篇(3)——Aptana Studio3乱码的问题
在Aptana Studio里面使用,发现输入的中文是乱码,在浏览器中浏览也是乱码,想着肯定是编码的问题,但是一直没有找到在那个地方设置.以为汉化后就可以了,没想到汉化后竟然还是乱码, ...
- **leetcode笔记--4 Sum of Two Integers
question: Calculate the sum of two integers a and b, but you are not allowed to use the operator + a ...
- AutoMapper.RegExtension 介绍
AutoMapper.RegExtension 为一个特小特小特小的用来根据约定自动调用AutoMapper中的方法配置映射的扩展库.你可以引入该库也可以将源码中核心部分的代码文件夹整个拷贝至项目中. ...
- C++学习005-循环
C++在循环方面,感觉个C没有身边么区别 while循环 for循环 do while循环 其实 使用Goto也可以写个循环 编写环境vs2015 1. while循环 int main() { in ...
- CSS3 :animation 动画
CSS3动画分为二部份: 1.定义动画行为: 使用@keyframes定义动画行为,有两种方式: 方式一:仅定义动画起始样式,与动画结束样式 @keyframes (动画行为名称) { from {b ...
- 孤荷凌寒自学python第七十四天开始写Python的第一个爬虫4
孤荷凌寒自学python第七十四天开始写Python的第一个爬虫4 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 直接上代码.详细过程见文末屏幕录像 ...
- java 读取配置文件 与更新
笔记 public class Config { private static Properties props = new Properties(); static File configFile ...
- Ajax跨域请求解决方式
前端 jQuery方式 .ajax({ type: "POST", url: "http://xxx.com/api/test", dataType: 'jso ...