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

首先二分一下答案,然后问题就变成了求混合图的欧拉回路。

这是网络流比较经典的一个问题,详细做法可以看这篇博客

Code

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<cstdio>
  5. #include<queue>
  6. #define N (5009)
  7. using namespace std;
  8.  
  9. struct Edge{int to,next,flow;}edge[N<<];
  10. int n,m,a[N],b[N],c[N],d[N];
  11. int s,e=,tot,Depth[N],Deg[N];
  12. int head[N],num_edge;
  13. queue<int>q;
  14.  
  15. void add(int u,int v,int l)
  16. {
  17. edge[++num_edge].to=v;
  18. edge[num_edge].next=head[u];
  19. edge[num_edge].flow=l;
  20. head[u]=num_edge;
  21. }
  22.  
  23. int DFS(int x,int low)
  24. {
  25. if (x==e || !low) return low;
  26. int f=;
  27. for (int i=head[x]; i; i=edge[i].next)
  28. if (Depth[edge[i].to]==Depth[x]+)
  29. {
  30. int Min=DFS(edge[i].to,min(low,edge[i].flow));
  31. edge[i].flow-=Min;
  32. edge[((i-)^)+].flow+=Min;
  33. f+=Min; low-=Min;
  34. if (!low) break;
  35. }
  36. if (!f) Depth[x]=-;
  37. return f;
  38. }
  39.  
  40. bool BFS(int s,int e)
  41. {
  42. memset(Depth,,sizeof(Depth));
  43. Depth[s]=; q.push(s);
  44. while (!q.empty())
  45. {
  46. int x=q.front(); q.pop();
  47. for (int i=head[x]; i; i=edge[i].next)
  48. if (!Depth[edge[i].to] && edge[i].flow)
  49. {
  50. Depth[edge[i].to]=Depth[x]+;
  51. q.push(edge[i].to);
  52. }
  53. }
  54. return Depth[e];
  55. }
  56.  
  57. int Dinic(int s,int e)
  58. {
  59. int ans=;
  60. while (BFS(s,e)) ans+=DFS(s,0x7fffffff);
  61. return ans;
  62. }
  63.  
  64. bool check(int lim)
  65. {
  66. memset(head,,sizeof(head));
  67. num_edge=;
  68.  
  69. for (int i=; i<=m; ++i)
  70. {
  71. if (c[i]>lim) return ;
  72. if (d[i]<=lim) add(a[i],b[i],), add(b[i],a[i],);
  73. }
  74. for (int i=; i<=n; ++i)
  75. {
  76. if (Deg[i]<) add(s,i,-Deg[i]/), add(i,s,);
  77. if (Deg[i]>) add(i,e,Deg[i]/), add(e,i,);
  78. }
  79. return Dinic(s,e)==tot/;
  80. }
  81.  
  82. int main()
  83. {
  84. scanf("%d%d",&n,&m);
  85. for (int i=; i<=m; ++i)
  86. {
  87. scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
  88. if (c[i]>d[i]) swap(a[i],b[i]), swap(c[i],d[i]);
  89. Deg[a[i]]--, Deg[b[i]]++;
  90. }
  91. for (int i=; i<=n; ++i)
  92. if (Deg[i]%) {puts("NIE"); return ;}
  93. else tot+=abs(Deg[i]/);
  94. int l=,r=,ans=-;
  95. while (l<=r)
  96. {
  97. int mid=(l+r)>>;
  98. if (check(mid)) ans=mid, r=mid-;
  99. else l=mid+;
  100. }
  101. printf("%d\n",ans);
  102. }

BZOJ2095:[POI2010]Bridges(最大流,欧拉图)的更多相关文章

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

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

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

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

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

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

  4. bzoj2095: [Poi2010]Bridges(二分+混合图求欧拉回路)

    传送门 这篇题解讲的真吼->这里 首先我们可以二分一个答案,然后把所有权值小于这个答案的都加入图中 那么问题就转化为一张混合图(既有有向边又有无向边)中是否存在欧拉回路 首先 无向图存在欧拉回路 ...

  5. BZOJ2095 [Poi2010]Bridges

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

  6. BZOJ.2095.[POI2010]Bridges(最大流ISAP 二分 欧拉回路)

    题目链接 最小化最大的一条边,二分答案.然后就变成了给一张无向图定向使其为欧拉回路 二分答案后对于一个位置的两条边可能都保留,即双向边,需要给它定向:可能只保留小的一条,即单向边,不需考虑 如何给它定 ...

  7. [Poi2010]Bridges 最大流+二分答案 判定混合图欧拉回路

    https://darkbzoj.cf/problem/2095 bzoj 相同的题挂了,这个oj可以写. 题目就是要我们找一条欧拉回路(每个桥经过一次就好,不管方向),使得这条回路上权值最大的尽量小 ...

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

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

  9. bzoj千题计划228:bzoj2095: [Poi2010]Bridges

    http://www.lydsy.com/JudgeOnline/problem.php?id=2095 二分答案,判断是否存在混合图的欧拉回路 如果只有一个方向的风力<=mid,这条边就是单向 ...

随机推荐

  1. 学习Memcached:2基本应用之控制台使用

    1.首先新建一个控制台应用. 2.将下载好需要引用的Memcached的Dll导入进来. 3.前期准备工作就结束了,其实很简单,memcache的配置使用是挺简单.下面就是写代码了. using Me ...

  2. [android] 新闻客户端实现左侧导航点击切换

    设置主布局文件,为根布局设置一个id,作为内容区 给ListView的条目设置点击事件,setOnItemClickListener()方法,参数:上下文 当前的Fragment实现OnItemCli ...

  3. Eclipse启动tomcat后404错误

    题描述 在eclipse部署web项目后,发现tomcat可以启动,但是访问http://localhost:8080地址报404错误.而不使用eclipse启动tomcat,直接通过通过tomcat ...

  4. 设计模式-原型(prototype)

     一.概念 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 二.模式动机 当已有一个对像,暂且称之为原型对象,需要一个新的对像,该对像和已有的原型对像具有相同的类型,且里面的属性大部分 ...

  5. protocol buffer c#

    第一.打开vs中的Nuget

  6. 阿里云数据库配置学习笔记(二):下载并配置MySQL数据库

    参考资料:阿里云官方文档 2018-02-20 一.MySQL数据库的下载 在Ubuntu环境下安装MySQL数据库十分简单 在命令行中输入 sudo apt-get update(更新软件源,预防出 ...

  7. POJ1236(KB9-A 强连通分量)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19326   Accepted: 75 ...

  8. 让你彻底搞懂JS中复杂运算符==

    让你彻底搞懂JS中复杂运算符== 大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容易让人犯错,从而成为JavaScript中“最糟糕的特性”之一. 在仔细阅读了ECMA ...

  9. Mysql实现级联操作(级联更新、级联删除)

    一.首先创建两张表stu,sc create table stu( sid int UNSIGNED primary key auto_increment, name ) not null) TYPE ...

  10. 使用ThinkPHP实现生成缩略图及显示

    首先了解父类Image.class.php(ThinkPHP/Library/Think/Image.class.php)中的一些函数 1:open() 打开被处理的图片 2:thumb() 生成缩略 ...