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

2095: [Poi2010]Bridges

Time Limit: 10 Sec  Memory Limit: 259 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

4 4
1 2 2 4
2 3 3 4
3 4 4 4
4 1 5 4

Sample Output

4

HINT

注意:通过桥为欧拉回路
题解:注意到“最大值最小”这一关键词,不难转化为想到二分答案判合法性问题。
那么我们接下来要判断的就是“混合图是否存在欧拉回路”这一问题。
我们考虑先给无向边规定一个方向,但是在这种定义下,得到的图未必是一个欧拉图,即有的点入度大于出度,有的点出度大于入度。
接下来我们考虑给已经定向的无向边“反向”。
设i点入度与出度的差值为delta[i],那么对于每个点,delta[i]显然一定是偶数,因为连着它的一条边反向就会造成±2的改变;
那么我们要做到工作就是“反转”某些边,使得delta全为0为了实现目的,我们:
从源点向入度大于出度的点连流量为入度减出度/2的边,从入度小于出度向汇点的点连流量为出度减入度/2的边;
如果这样的边能够跑满,那么这个点就得到了完全的调整。
对一条无向边,连这条边的方向反向,流量为1的边,表示将这条边反向,两个点的入度与出度得到调整;
对这个网络求最大流就调整了尽可能多的无向边,源点和汇点所连边的流量都跑满时,
所有需要调整的边都被调整,出现了欧拉回路。
所以我们一开始记录一下与源点相连的边的流量和sum,再跑一边dinic/ISAP看是否满流即可。
代码实现:
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N=1010,M=2010,inf=0x7fffffff;
 6 struct edge{int zhong,next,flow;};
 7 int a[M],b[M],c[M],d[M],delta[N],n,sum,m;
 8 struct NetWork_Flow
 9 {
10     edge s[M<<3];
11     int S,T,e,adj[N],cur[N];
12     int dist[N],hd,tl,q[N],cnt[N];
13     inline void add(int qi,int zhong,int flow)
14         {s[++e].zhong=zhong,s[e].next=adj[qi],adj[qi]=e,s[e].flow=flow;}
15     inline void bfs()
16     {
17         memset(cnt,0,sizeof(cnt)),memset(dist,0,sizeof(dist));
18         hd=1,tl=0,dist[T]=1,q[++tl]=T;
19         register int i,x;
20         while(hd<=tl)
21             for(x=q[hd++],++cnt[dist[x]],i=adj[x];i;i=s[i].next)
22                 if(s[i^1].flow&&!dist[s[i].zhong])
23                     dist[s[i].zhong]=dist[x]+1,q[++tl]=s[i].zhong;
24     }
25     inline int Shoot(int rt,int maxf)
26     {
27         if(rt==T||!maxf)return maxf;
28         register int i,x,u,f,ret=0;
29         for(i=cur[rt];i;i=s[i].next)
30             if(dist[s[i].zhong]+1==dist[rt])
31             {
32                 f=Shoot(s[i].zhong,min(maxf,s[i].flow));
33                 ret+=f,maxf-=f,s[i].flow-=f,s[i^1].flow+=f;
34                 if(!maxf)return ret;
35             }
36         if(!(--cnt[dist[rt]]))dist[S]=T+2;
37         ++cnt[++dist[rt]],cur[rt]=adj[rt];
38         return ret;
39     }
40     inline int ISAP()
41     {
42         register int i;
43         memcpy(cur,adj,sizeof(adj));
44         int maxf=0;bfs();
45         while(dist[S]<=T+1)maxf+=Shoot(S,inf);
46         return maxf;
47     }
48     inline void build(int val)
49     {
50         register int i;
51         e=1,sum=0,memset(adj,0,sizeof(adj));
52         memset(delta,0,sizeof(delta));
53         for(i=1;i<=m;++i)
54         {
55             if(c[i]<=val)--delta[a[i]],++delta[b[i]];
56             if(d[i]<=val)
57                 add(b[i],a[i],1),add(a[i],b[i],0);
58         }
59         for(i=1;i<=n;++i)
60             if(delta[i]>0)sum+=delta[i]/2,add(S,i,delta[i]/2),add(i,S,0);
61             else add(i,T,-delta[i]/2),add(T,i,0);
62     }
63     inline bool check(int val)
64     {
65         register int i;
66         build(val);
67         for(i=1;i<=n;++i)
68             if(delta[i]&1)return 0;
69         return ISAP()==sum;
70     }
71 }G;
72 int main()
73 {
74     scanf("%d%d",&n,&m);
75     G.S=n+1,G.T=n+2;
76     register int i,j;
77     int l=1001,r=0,mi,ans=inf;
78     for(i=1;i<=m;++i)
79     {
80         scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
81         if(c[i]>d[i])swap(c[i],d[i]),swap(a[i],b[i]);
82         l=min(l,c[i]),r=max(r,d[i]);
83     }
84     while(l<=r)
85     {
86         mi=l+r>>1;
87         if(G.check(mi))r=mi-1,ans=mi;
88         else l=mi+1;
89     }
90     if(ans==inf)puts("NIE");
91     else printf("%d\n",ans);
92 }

 

转载于:https://www.cnblogs.com/LadyLex/p/7588290.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

excel和python建模_利用Excel学习Python:准备篇

写在前面这个系列我们要利用Excel的知识&#xff0c;学会用python进行数据分析&#xff0c;如果你精通Excel想要用python提高数据分析效率&#xff0c;那么这个系列你来对了&#xff0c;如果你已经是python大神&#xff0c;想要建模/算法等高级技巧的&#xff0c;这个系列可能不…

方法内联在JVM中有多积极?

IntelliJ IDEA中使用Ctrl Alt M 提取方法 。 Ctrl Alt M。 这就像选择一段代码并按此组合一样简单。 Eclipse也有它 。 我讨厌冗长的方法。 对于我来说&#xff0c;闻起来太久了&#xff1a; public void processOnEndOfDay(Contract c) {if (DateUtils.addDays(c.getCrea…

Python正则表达式基础

1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具&#xff0c;拥有自己独特的语法以及一个独立的处理引擎&#xff0c;效率上可能不如str自带的方法&#xff0c;但功能十分强大。得益于这一点&#xff0c;在提供了正则表…

Java并发:隐藏线程死锁

大多数Java程序员熟悉Java线程死锁概念。 它本质上涉及2个线程&#xff0c;它们彼此永远等待。 这种情况通常是平面&#xff08;同步&#xff09;或ReentrantLock&#xff08;读或写&#xff09;锁排序问题的结果。 Found one Java-level deadlock:"pool-1-thread-2"…

vue中使用axios发送请求

我们知道&#xff0c;vue2.0以后&#xff0c;vue就不再对vue-resource进行更新&#xff0c;而是推荐axios&#xff0c;而大型项目都会使用 Vuex 来管理数据&#xff0c;所以这篇博客将结合两者来发送请求 1.安装axios cnpm i axios -S 2.方案一&#xff1a;修改原型链 首先&…

django缓存

由于Django是动态网站&#xff0c;所有每次请求均会去数据进行相应的操作&#xff0c;当程序访问量大时&#xff0c;耗时必然会更加明显&#xff0c;最简单解决方式是使用&#xff1a;缓存&#xff0c;缓存将一个某个views的返回值保存至内存或者memcache中&#xff0c;5分钟内…

linux 输入法成繁体字_寻找Ubuntu中繁体字输入法

当客户来自港台地区时&#xff0c;英文和繁体字就成了交流的主要工具。windows下我们有搜狗输入法可以切换简体与繁体&#xff0c;那么Ubuntu下怎么办&#xff1f;這是我第一次考慮這個問題&#xff0c;在我的印象裏Linux下的中文輸入法還不是那麼完善&#xff0c;所以我進行了…

vue跨域解决方法

vue跨域解决方法 vue项目中&#xff0c;前端与后台进行数据请求或者提交的时候&#xff0c;如果后台没有设置跨域&#xff0c;前端本地调试代码的时候就会报“No Access-Control-Allow-Origin header is present on the requested resource.” 这种跨域错误。 要想本地正常的调…

CSS盒子模型之详解

前言&#xff1a; 盒子模型是css中最核心的基础知识&#xff0c;理解了这个重要的概念才能更好的排版&#xff0c;进行页面布局。一、css盒子模型概念 CSS盒子模型 又称框模型 (Box Model) &#xff0c;包含了元素内容&#xff08;content&#xff09;、内边距&#…

LeetCode的二分查找的练习部分总结

这两天由于工作的原因&#xff0c;一直没有写博客&#xff0c;但是却把LeetCode上面的题目做了不少——二分查找。上面这些题都是这两天写的。现在简单做一个总结。 首先二分查找的思想就是对一个有规律的元素&#xff08;事情&#xff09;进行不断的排除&#xff0c;最后找到符…

在Mac上安装IntelliJ IDEA

在Mac上安装IntelliJ IDEA http://www.jetbrains.com/idea/documentation/ 入门视频 这篇文章旨在介绍如何在Mac系统上安装IntelliJ IDEA&#xff0c;至于IntelliJ IDEA的介绍和使用方法&#xff0c;大家另行查阅&#xff0c;本篇的文章不再详细阐述。 简短解说&#xff0c;I…

行内元素,块级元素,各自特点及其相互转化

作为一名小前端&#xff0c;块级元素、行内元素用了几千几万次&#xff0c;除了“块级独占一行&#xff0c;行内不独占”之外&#xff0c;对细节属性的了解十分匮乏&#xff0c;今天做以部分属性的测试和阐述。 一、 对物理属性的支持 元素类别widthheightpaddingmargin是否独…

从RSS Feed和YQL创建数据表

Yahoo Query Language&#xff08; YQL &#xff09;是一种查询语言&#xff0c;例如SQL。 使用YQL&#xff0c;我们可以跨Web服务 查询 &#xff0c; 过滤和联接数据。 YQL也可以阅读RSS feed。 响应可以是JSON或XML。 雅虎提供了一个YQL控制台&#xff0c;用于调试 &…

Qt之QSS(Q_PROPERTY-自定义属性)

版权声明&#xff1a;进步始于交流&#xff0c;收获源于分享&#xff01;纯正开源之美&#xff0c;有趣、好玩、靠谱。。。作者&#xff1a;一去丶二三里 博客地址&#xff1a;http://blog.csdn.net/liang19890820 目录(?)[] 简述 在Qt之QSS&#xff08;Q_PROPERTY-原始属性&a…

python print error 空_python笔记37:10分钟掌握异常处理,再也不担心程序挂了

主要内容&#xff1a;小目标&#xff1a;异常处理主要内容&#xff1a;错误与异常&#xff0c;try_except语句对于撸代码的程序员来说&#xff0c;程序运行中出现问题是常见的现象&#xff1b;实际学习与工作中&#xff0c;我们会花很大的精力去解决各种问题&#xff1b;1. 程序…

contenteditable元素的placeholder输入提示语设置

在某些情况下&#xff0c;textarea是不够用的&#xff0c;我们还需要显示一些图标或者高亮元素&#xff0c;这就需要用富文本编辑器&#xff0c;而富文本编辑器本质上是HTML元素设置了contenteditable。 然后可能需要像input、textarea有placeholder的输入提示语&#xff0c;但…

css 浮动和清除浮动

在写页面布局的过程中&#xff0c;浮动是大家经常用的属性。在好多的排版布局中都是用的的浮动比如说下面这些地方都是应用到了浮动。 在我学习浮动的时候可是熬坏了脑筋&#xff0c;在这里我分享一下我对浮动这块知识的总结。 一、浮动的定义 使元素脱离文档流&#xff0c;按…

Java Code Geeks和Packt提供的Hadoop书籍赠品

亲爱的极客&#xff0c;由于参与度很高&#xff0c;并且为了有机会赢得尽可能多的Hadoop粉丝&#xff0c;我们决定将竞赛延长一个星期&#xff0c;直到下周二。 各位极客&#xff0c; 赠品在Java Code Geeks上继续。 我们很高兴地宣布&#xff0c;我们再次与Packt Publishin…

【转】 差分约束系统详解(转化为最短路) (概念)

---恢复内容开始--- 转自&#xff1a;http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 差分约束系统中&#xff1a; 如果求未知数的最大值&#xff0c;那么按小于等于建图后求最短路即可。&#xff08;因为求最短路是由无穷向下约束而得到的&#xff0c;所以得到…

【HTML基础】表格和表单

本次博客的主要内容如下&#xff1a; meta和link表格表单 meta和link meta meta的属性有两种&#xff1a;name和http-equiv。 name属性主要用于描述网页内容&#xff0c;对应与网页内容。 1.关键字&#xff0c;当搜索引擎在爬取内容的时候&#xff0c;会根据关键字判断&a…