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

4 4

1 2 2 4

2 3 3 4

3 4 4 4

4 1 5 4

Sample Output

4


首先看到最大风力最小就知道是二分

然后我们把图建出来发现是有些边有向,有些边无向,所以就是混合图欧拉回路

有关混合图欧拉回路的求解,可以看一看这篇文章



#include<bits/stdc++.h>
using namespace std;
#define N 2010
#define INF 0x3f3f3f3f
struct Edge{int u,v,cap,flow;};
struct Dinic{
int s,t,d[N];bool vis[N];
vector<int> G[N];
vector<Edge> E;
void init(int _n){
E.clear();
for(int i=0;i<=_n;i++)G[i].clear();
}
void add(int u,int v,int w){
E.push_back((Edge){u,v,w,0});
E.push_back((Edge){v,u,0,0});
int m=E.size();
G[u].push_back(m-2);
G[v].push_back(m-1);
}
bool bfs(){
static queue<int> q;
memset(vis,0,sizeof(vis));
q.push(s);d[s]=0;vis[s]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=0;i<G[u].size();i++){
Edge e=E[G[u][i]];
if(!vis[e.v]&&e.cap>e.flow){
vis[e.v]=1;
d[e.v]=d[e.u]+1;
q.push(e.v);
}
}
}
return vis[t];
}
int dfs(int u,int a){
if(!a||u==t)return a;
int flow=0;
for(int i=0;i<G[u].size();i++){
Edge &e=E[G[u][i]];
if(d[e.v]!=d[u]+1)continue;
int f=dfs(e.v,min(a,e.cap-e.flow));
e.flow+=f;
E[G[u][i]^1].flow-=f;
flow+=f;
a-=f;
if(!a)break;
}
if(!flow)d[u]=0;
return flow;
}
int Maxflow(){
int flow=0;
while(bfs())flow+=dfs(s,INF);
return flow;
}
}dinic;
int n,m;
int U[N],V[N],C[N],D[N];
int in[N],out[N];
bool check(int val){
for(int i=1;i<=n;i++)in[i]=out[i]=0;
dinic.init(n+1);
int sum=0;
for(int i=1;i<=m;i++){
if(C[i]<=val)out[U[i]]++,in[V[i]]++;
if(D[i]<=val)dinic.add(V[i],U[i],1);
}
for(int i=1;i<=n;i++)if(abs(in[i]-out[i])&1)return 0;
for(int i=1;i<=n;i++){
int tmp=in[i]-out[i];
if(tmp>0)sum+=tmp>>1;
if(tmp>0)dinic.add(0,i,tmp>>1);
if(tmp<0)dinic.add(i,n+1,(-tmp)>>1);
}
return dinic.Maxflow()==sum;
}
int main(){
scanf("%d%d",&n,&m);
dinic.s=0;dinic.t=n+1;
int L=INF,R=0,ans=-1;
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&U[i],&V[i],&C[i],&D[i]);
if(C[i]>D[i])swap(C[i],D[i]),swap(U[i],V[i]);
L=min(L,C[i]);
R=max(R,D[i]);
}
while(L<=R){
int mid=(L+R)>>1;
if(check(mid))R=mid-1,ans=mid;
else L=mid+1;
}
if(ans==-1)printf("NIE");
else printf("%d",ans);
return 0;
}

BZOJ2095 POI2010 Bridges 【二分+混合图欧拉回路】的更多相关文章

  1. [BZOJ2095][Poi2010]Bridges 二分+网络流

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

  2. 【BZOJ-2095】Bridge 最大流 + 混合图欧拉回路 + 二分

    2095: [Poi2010]Bridges Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 604  Solved: 218[Submit][Stat ...

  3. bzoj 2095: [Poi2010]Bridges [混合图欧拉回路]

    2095: [Poi2010]Bridges 二分答案,混合图欧拉路判定 一开始想了一个上下界网络流模型,然后发现不用上下界网络流也可以 对于无向边,强制从\(u \rightarrow v\),计算 ...

  4. BZOJ2095 [Poi2010]Bridges

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

  5. POJ 1637 Sightseeing tour ★混合图欧拉回路

    [题目大意]混合图欧拉回路(1 <= N <= 200, 1 <= M <= 1000) [建模方法] 把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为 ...

  6. POJ 1637 混合图欧拉回路

    先来复习一下混合图欧拉回路:给定一张含有单向边和双向边的图,使得每一点的入度出度相同. 首先对于有向边来说,它能贡献的入度出度是确定的,我们不予考虑.对于无向图,它可以通过改变方向来改变两端点的出入度 ...

  7. poj1637Sightseeing tour(混合图欧拉回路)

    题目请戳这里 题目大意:求混合图欧拉回路. 题目分析:最大流.竟然用网络流求混合图的欧拉回路,涨姿势了啊啊.. 其实仔细一想也是那么回事.欧拉回路是遍历所有边一次又回到起点的回路.双向图只要每个点度数 ...

  8. poj1637 Sightseeing tour(混合图欧拉回路)

    题目链接 题意 给出一个混合图(有无向边,也有有向边),问能否通过确定无向边的方向,使得该图形成欧拉回路. 思路 这是一道混合图欧拉回路的模板题. 一张图要满足有欧拉回路,必须满足每个点的度数为偶数. ...

  9. POJ 1637 - Sightseeing tour - [最大流解决混合图欧拉回路]

    嗯,这是我上一篇文章说的那本宝典的第二题,我只想说,真TM是本宝典……做的我又痛苦又激动……(我感觉ACM的日常尽在这张表情中了) 题目链接:http://poj.org/problem?id=163 ...

随机推荐

  1. UVa 11354 邦德(最小瓶颈路+LCA)

    https://vjudge.net/problem/UVA-11354 题意: 有n个城市m条道路,每条道路有一个危险系数.先在有若干个询问,要求找到一条从s到t的路,使得途径所有边的最大危险系数最 ...

  2. HDU 3639 Hawk-and-Chicken(强连通缩点+反向建图)

    http://acm.hdu.edu.cn/showproblem.php?pid=3639 题意: 有一群孩子正在玩老鹰抓小鸡,由于想当老鹰的人不少,孩子们通过投票的方式产生,但是投票有这么一条规则 ...

  3. Entity Framework 基于Oracle的code first 问题汇总

    1. 在code first 在数据库中建表时,需要指定schema, 默认是dbo, 需要改成我们的oracle登录名 protected override void OnModelCreating ...

  4. Linux系统用户及用户组管理

    目录一.新增/删除用户和用户组二.创建/修改密码三.用户身份切换--su和sudo 一.新增/删除用户和用户组1.用户组 命令 : groupadd 语法 : groupadd [-g GID] gr ...

  5. thinkphp getField("xxxxx", true); 得到一个字段所有值组成的的数组

    很多时候我们只需要一张表里某个字段的值,组成的数组 $Channel = D('channel');$channelList = $Channel->order('user_name')-> ...

  6. 委托---.net4.0提供两个比较重要的委托

    public delegate void Action<[in T1][,in T2][,in T3]......>([T1 t1][,T2 t2][,T3 t3]...) public ...

  7. 《高级Web应用程序设计》课件(20170911)

    第一阶段:千里之行,始于足下 第1章 ASP.NET MVC概述 第2章 音乐商店制作 第二阶段:欲穷千里目,更上一层楼 第3章 设计模型 3.1 数据模型概述 3.2 使用EF Code First ...

  8. 一个不错的JavaScript解析浏览器路径方法

    JavaScript中有时需要用到当前的请求路径等涉及到url的情况,正常情况下我们可以使用location对象来获取我们需要的信息,本文从另外一个途径来解决这个问题,而且更加巧妙 方法如下: fun ...

  9. HDU - 59562016ACM/ICPC亚洲区沈阳站I - The Elder 树上斜率优化dp

    题意:给定上一棵树,然后每条边有一个权值,然后每个点到 1 的距离有两种,第一种是直接回到1,花费是 dist(1, i)^2,还有另一种是先到另一个点 j,然后两从 j 向1走,当然 j 也可以再向 ...

  10. UVA-11090 Going in Cycle!! (平均值最大回路)

    题目大意:一个n个点,m条无向边的图,求出平均权值最小的回路. 题目分析:二分枚举平均值mid,只需判断是否存在平均值小于mid的回路,即判断是否有sum(wi)<mid*k (1≤i≤k),只 ...