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

HINT

注意:通过桥为欧拉回路

Solution:

人生第一道网络流,竟然交给了欧拉回路…

对于这道题,首先最大风力最小,显然是要先二分答案,然后这就转化成了一个经典的问题:混合图的欧拉回路判定问题。在本博客欧拉回路一文中另有阐述,此处不再赘述。(此处采用的POI的题目要求输出了方案)

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<vector>
#include<queue>
#define mp(a,b,c) (Edge){a,b,c}
#define M 2005
#define INF 1000000000
using namespace std;
struct Edge{int to,c,rev;};
int A[M],B[M],C[M],D[M],n,m,degreein[M],degreeout[M],S,T;
struct Dinic{int id[M],level[M];vector<Edge>G[M];void Init(){for(int i=S;i<=T;i++)G[i].clear();}void Addedge(int s,int t,int c){G[s].push_back(mp(t,c,G[t].size()));G[t].push_back(mp(s,0,G[s].size()-1));}void BFS(int s){queue<int>Q;level[s]=0;Q.push(s);while(!Q.empty()){int top=Q.front();Q.pop();for(int i=0;i<G[top].size();i++){int to=G[top][i].to;if(G[top][i].c==0||level[to]!=-1)continue;level[to]=level[top]+1;Q.push(to);}}}int dfs(int s,int t,int f){if(s==t)return f;for(int &i=id[s];i<G[s].size();i++){int to=G[s][i].to;if(level[to]>level[s]&&G[s][i].c){int d=dfs(to,t,min(f,G[s][i].c));if(d){G[s][i].c-=d;G[to][G[s][i].rev].c+=d;return d;}}}return 0;}int maxflow(int s,int t){int maxflow=0;while(1){memset(level,-1,sizeof(level));memset(id,0,sizeof(id));BFS(s);if(level[t]==-1)return maxflow;int f;while(f=dfs(s,t,INF))maxflow+=f;}}
}Dinic;
bool check(int x){int full=0;memset(degreein,0,sizeof(degreein));memset(degreeout,0,sizeof(degreeout));Dinic.Init();for(int i=1;i<=m;i++){if(C[i]>x&&D[i]>x)return false;if(C[i]>x&&D[i]<=x){degreein[A[i]]++;degreeout[B[i]]++;}else{degreein[B[i]]++;degreeout[A[i]]++;if(C[i]<=x&&D[i]<=x)Dinic.Addedge(A[i],B[i],1);}}for(int i=1;i<=n;i++){int x=abs(degreein[i]-degreeout[i]);if(x&1)return false;if(degreein[i]>degreeout[i])Dinic.Addedge(i,T,x/2);else {Dinic.Addedge(S,i,x/2);full+=x/2;}}return Dinic.maxflow(S,T)==full;
}
int ID[M][M];
int ans[M],sz=0;
void Pf(int x){for(int i=1;i<=n;i++){if(!ID[x][i])continue;int t=ID[x][i];ID[x][i]=0;Pf(i);ans[++sz]=t;}
}
int main(){int L,R,res=-1;scanf("%d %d",&n,&m);S=0;T=n+1;for(int i=1;i<=m;i++){scanf("%d %d %d %d",&A[i],&B[i],&C[i],&D[i]);if(i==1||C[i]<L)L=C[i];if(i==1||C[i]>R)R=C[i];if(D[i]<L)L=D[i];if(D[i]>R)R=D[i];ID[A[i]][B[i]]=ID[B[i]][A[i]]=i;}while(L<=R){int mid=(L+R)>>1;if(check(mid)){res=mid;R=mid-1;}else L=mid+1;}if(res==-1)puts("NIE");else{printf("%d\n",res);check(res);for(int i=1;i<=m;i++){if(C[i]>res)ID[A[i]][B[i]]=0;if(D[i]>res)ID[B[i]][A[i]]=0;}for(int i=1;i<=n;i++)for(int j=0;j<Dinic.G[i].size();j++){int to=Dinic.G[i][j].to;if(to==T||to==S||Dinic.G[i][j].c==1)continue;ID[i][to]=0;}Pf(1);for(int i=sz;i>=1;i--)printf("%d%c",ans[i],i==1?'\n':' ');}return 0;
}

BZOJ2095[Poi2010] Bridges相关推荐

  1. BZOJ2095 POI2010 Bridges 【二分+混合图欧拉回路】

    BZOJ2095 POI2010 Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛 ...

  2. bzoj2095 [Poi2010]Bridges

    bzoj [Poi2010]Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到 ...

  3. [BZOJ2095][Poi2010]Bridges 最大流(混合图欧拉回路)

    2095: [Poi2010]Bridges Time Limit: 10 Sec  Memory Limit: 259 MB Description YYD为了减肥,他来到了瘦海,这是一个巨大的海, ...

  4. Bzoj2095:[Poi2010]Bridges:混合图欧拉回路,网络流

    题目链接:2095:[Poi2010]Bridges 二分答案建图后显然是混合图的欧拉回路,有向边删掉无向边随机定向计算入度-出度的差du[i],如果du[i]<0连边(i,T,-du[i]/2 ...

  5. 图论欧拉回路初步 BZOJ2095 POI2010 Bridges

    反正对于现在的我来说是好题.顺便膜po大犇和dingchao大犇. 网络流什么的还是再开一个专题好了. 欧拉回路问题参考论文<欧拉回路性质与应用探究>by 仇荣琦. POI2010 题解整 ...

  6. bzoj2095: [Poi2010]Bridges 二分+最大流

    想当年第一次看到这个题是在**p的一套模拟题里?然后当时想过二分也想过最大流.然后就是没有想到一块,最后知道做法后就不了了之了. #include <iostream> #include ...

  7. 【BZOJ2095】【最大流】[Poi2010]Bridges 题解

    Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛.现在YYD想骑单车从小岛1 ...

  8. BZOJ 2095: [Poi2010]Bridges 混合图欧拉回路

    YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个小岛.现在YYD想骑单车从小岛1出发,骑过每一座桥,到达 ...

  9. BZOJ 2095 [POI2010]Bridges (最大流、欧拉回路)

    洛谷上有这题,但是输出方案缺SPJ..(而且我也懒得输出方案了) 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2095 题解: 首先判 ...

最新文章

  1. codeforces654题解_CodeForces - 886C 解题思路
  2. OpenSceneGraph学习笔记
  3. 成为解决计算机问题的利器,高中数学教学借助计算机的“翅膀”腾飞
  4. 《Windows Communication Foundation之旅》系列之二
  5. Teams Bot如何判断用户所在的时区
  6. SilkierQuartz 1.0.21 发布, 是一个 Quartz.NET 的强大且简单的Web管理工具和承载组件...
  7. 安卓平台OpenGL ES的调用
  8. 别被忽悠了!我来谈谈大数据平台的4个要点,你们写的都不是干货
  9. java se 6 mac_Mac OS X “打开xx软件, 你需要一个Java SE 6运行环境”问题解决
  10. java前后端分离是否会成为趋势
  11. 再见!收费的 XShell,我改用国产良心工具!
  12. latex常用最要快捷键
  13. 【企业架构】什么是数据架构? 管理数据的框架
  14. HDMI接口定义,传输流程
  15. Android POPWindow
  16. 面试被问到HashMap 底层原理?看完这边文章绝对不慌!
  17. Markdown编辑器 - 字体颜色表(颜色名、十六进制颜色值、颜色)
  18. CSDN信息无障碍知识库:为障碍者撑起一片蓝天
  19. [ctf.show.reverse] 数学不及格
  20. 基于stm32的grbl写字机器人(添加舵机支持)

热门文章

  1. HttpURLConnection获取百度搜狗360搜索链接重定向真实目标链接地址url
  2. sentinel限流介绍
  3. 1343. Fairy Tale
  4. 笔记本电脑电池使用方式/BIOS信息
  5. html鼹鼠出现不重叠,洛谷 P2285 BZOJ 1207 [HNOI2004]打鼹鼠
  6. CSS Sprites定位实现
  7. pleasureupafanfou
  8. 2021年立下的Flag完成情况
  9. 荣耀Magic V重新定义折叠屏:首先是一部好用的主力机
  10. linux运行不存在的命令报错