【BZOJ2095】 Bridge
Time Limit: 1000 ms Memory Limit: 128 MB
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
题目要求的,是对于每一座桥定向后来的欧拉回路。(这个理解错了我就彻底懵逼了)
可以考虑二分答案$ans$:对于每一座桥,只将边权小于等于$ans$的边加入图中。这是一个混合图,用网络流求解是否为欧拉回路即可。若是则$r=mid-1$,否则$l=mid+1$。
最后的答案落在$l$。
如果$l$大过所有边权的最大值,那么就是NIE。
#include <cstdio>
#include <queue>
using namespace std;
const int N=,M=,INF=;
int n,m,maxw,e[M][];
int h[N],tot,in[N],out[N];
int S,T,dis[N],cur[N];
queue<int> q;
struct Edge{int v,f,next;}g[M*];
inline int max(int x,int y){return x>y?x:y;}
inline void addEdge(int u,int v,int f){
g[++tot].v=v; g[tot].f=f; g[tot].next=h[u]; h[u]=tot;
g[++tot].v=u; g[tot].f=; g[tot].next=h[v]; h[v]=tot;
}
bool bfs(){
while(!q.empty()) q.pop();
q.push(S);
for(int i=;i<=T;i++) dis[i]=-;
dis[S]=;
while(!q.empty()){
int u=q.front(); q.pop();
for(int i=h[u],v;i;i=g[i].next)
if(g[i].f&&dis[v=g[i].v]==-){
dis[v]=dis[u]+;
if(v==T) return true;
q.push(v);
}
}
return dis[T]!=-;
}
int dfs(int u,int delta){
if(u==T) return delta;
int ret=,get;
for(int i=cur[u],v;i&δi=g[i].next)
if(g[i].f&&dis[v=g[i].v]==dis[u]+){
get=dfs(v,min(delta,g[i].f));
g[i].f-=get;
g[i^].f+=get;
if(g[i].f) cur[u]=i;
delta-=get;
ret+=get;
}
if(!ret) dis[u]=-;
return ret;
}
int dinic(){
int ret=;
while(bfs()){
for(int i=;i<=T;i++) cur[i]=h[i];
ret+=dfs(S,INF);
}
return ret;
}
bool check(int up){
tot=;
for(int i=;i<=T;i++) in[i]=out[i]=h[i]=;
for(int i=;i<=m;i++){
if(e[i][]<=up)
out[e[i][]]++,in[e[i][]]++;
if(e[i][]<=up)
addEdge(e[i][],e[i][],);
}
int sum=;
for(int i=;i<=n;i++){
if(!in[i]&&!out[i]) return false;
if((in[i]-out[i])%) return false;
if(in[i]>out[i])
addEdge(i,T,(in[i]-out[i])/);
else if(out[i]>in[i])
addEdge(S,i,(out[i]-in[i])/),sum+=(out[i]-in[i])/;
}
int get=dinic();
return get==sum;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d%d%d%d",&e[i][],&e[i][],&e[i][],&e[i][]);
maxw=max(maxw,max(e[i][],e[i][]));
if(e[i][]>e[i][])
swap(e[i][],e[i][]),swap(e[i][],e[i][]);
}
S=n+; T=n+;
int l=,r=maxw,mid;
while(l<=r){
mid=(l+r)>>;
if(check(mid)) r=mid-;
else l=mid+;
}
if(l>maxw) puts("NIE");
else printf("%d\n",l);
return ;
}
奇妙代码
【BZOJ2095】 Bridge的更多相关文章
- 【BZOJ-2095】Bridge 最大流 + 混合图欧拉回路 + 二分
2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 604 Solved: 218[Submit][Stat ...
- 【BZOJ2095】[Poi2010]Bridges 动态加边网络流
[BZOJ2095][Poi2010]Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个 ...
- 【BZOJ2095】[Poi2010]Bridges
[BZOJ2095][Poi2010]Bridges 题面 darkbzoj 题解 首先可以想到二分答案,那么我们就是要求我们新图中给所有边定向是否存在欧拉回路. 而有向图存在欧拉回路的充要条件为所有 ...
- 【设计模式】Bridge模式(桥接模式)
最近的一次面试中,被问到桥接模式,以前呢并没有很仔细的研究过这个设计模式,借此机会剖析一下. 先给出自己对这个模式理解后的源码: interface A{ void methodA(); } inte ...
- 【BZOJ2095】【POI2010】Bridge 网络流
题目大意 给你一个无向图,每条边的两个方向的边权可能不同.要求找出一条欧拉回路使得路径上的边权的最大值最小.无解输出"NIE". \(2\leq n\leq 1000,1\le ...
- 【设计模式】Bridge
前言 Bridge设计模式,将一个复杂类分成可以单独开发的部分.分成的两个部分,abstraction,implementation.字面上是抽象和实现,但不同于抽象方法及其实现.下面摘录Wiki的两 ...
- 【poj3608】 Bridge Across Islands
http://poj.org/problem?id=3608 (题目链接) 题意 求两凸包间最短距离 Solution 难写难调,旋转卡壳,还真是卡死我了. 先分别选出两凸包最上点和最下点,从这两点开 ...
- 【LA3485】 Bridge
前言 哈哈哈,垃圾微积分哈哈哈 前置知识:自适应Simpson法与微积分初步,学会编程 Solution 考虑一下我们有的是什么: 一段桥梁的横向距离,悬线的长度,以及高度. 我们发现如果我们重新设一 ...
- 【HDOJ6218】Bridge(线段树,set,网格图,连通性)
题意:给定一张2×n的网格图,一开始矩阵所有相邻点之间有一条边 有q个询问,每次给出两个相邻的点的坐标,将其中的边删除或者添加,问如此操作之后整张图的割边数量 n,q<=2*10^5, ...
随机推荐
- 使用telnet发送HTTP请求
使用telnet发送HTTP请求 写这篇博客,其实没有太大的实际意义,但是还是很有必要的,如果用好Telnet指令,就可以很好的理解HTTP的一些概念,特别是http1.1的持续链接. 要想使用Tel ...
- ProgressDialog的使用及逻辑处理
一般用的情况先声明一个ProgressDialog progressShow = true;(用来判断用户是否点击了取消键) final ProgressDialog pd = new Progres ...
- C#中的out参数/ref参数/params可变参数
out参数: out关键字 通过引用来传递参数,在定义方法和调用方法的时候都必须使用out关键字 简单来讲out可以用来返回多个参数类型. static void Main(string[] args ...
- Core Animation 文档翻译 (第八篇)—提高动画的性能
前言 核心动画是提高基于APP动画帧率的好方式,但是核心动画的使用不代表性能的提升的保证.尤其在OSX,当使用核心动画时,我们仍需选择最有效的方式.和所有的性能相关的问题一样,我们应该使用工具时时的评 ...
- java之Servlet监听器Listener
常用应用场景:单点登录.统计在线人数 一.简介 (一)概述 1.Listener 用于监听 java web程序中的事件,例如创建.修改.删除Session.request.context等,并触发响 ...
- CentOS7修改SSH远程连接端口
CentOS7修改SSH远程连接端口
- POJ [P3660] Cow Contest
传递闭包经典应用 奶牛的名次能确定当且仅当在它前面的牛数+在他后面的牛数==n-1 在他前面和后面的牛数可以转化成求完传递闭包后的出度和入度 #include <iostream> #in ...
- 使用Openresty加快网页速度
新年快乐~~~ 上一篇文章讲到使用多级缓存来减少数据库的访问来加快网页的速度,只是,仍旧没有"嗖"一下就加载出来的感觉,想再优化一下,优化代码什么的已经到了极限.上周无意中看到了o ...
- 运行所选代码生成器时出错:“预期具有协定名称 "NuGet.VisualStudio.IVsPackageInstallerServices" 的1导出 ——VS2015错误记录
在编写ASP.NET MVC控制器后,右键添加视图时,VS2015报出错误: 运行所选代码生成器时出错:“预期具有协定名称 "NuGet.VisualStudio.IVsPackageIns ...
- 发生Windows无法访问远程共享的解决办法
发现问题 今天在访问远程时发生一个很郁闷的网络错误,如下图所示 问题修复步骤 这个问题可以采用以下步骤来修复 Step1.添加网络映射盘 添加网络映射时选择使用其他凭据登陆,这样就有机会让Window ...