【OI笔记】网络流
前言
重操旧业!
正文
¶最大流
教程去OI-Wiki上看吧,我懒得打字了。 看了数不胜数的博客,发现没有一个用vector实现的,我大vector就这么没有面子? 其实大家不用vector的最主要原因应该是vector做不到O(1)查找反向边。但是。。。真的不行吗? 在经过一个晚自习的《充分》debug下,我成功地利用神奇的**pair<>**做到了O(1)查找反向边,就是关键代码有亿点点难看
1 |
|
1 |
|
&emsp下面就放上vector版的网络最大流代码吧
1 |
|
Vector YYDS!!!
¶费用流
先放代码,具体教程就到OI-WIKI或其它博客上学习吧(本人太菜写得不好)
1 |
|
代码不是关键,关键是如何证明,因为在这份代码上面缺少了我们熟悉的bfs与dfs,还缺少了我们熟悉的dep。但我们在代码中还是可以。。。等等,这貌似就是EK+SPFA吧。。。 那就不用证明了,结论就是 EK+SPFA 阿巴阿巴阿巴阿巴
¶特殊情况处理
¶1.费用流中的负环
其实不只是负环,应该说每一条费用为负数的边(有补贴~~~)。
以最小费用最大流为例,我们可以通过退流来消除费用为负数的边。 具体过程: 不妨设有一条从u到v的容量为c费用为d的边(d<0)。 先强制满流,把答案加上c×d。 之后,从u到T,S到v各连一条容量为c,费用为0的边,用来调整流量。这两条边要使用手段强制满流。 最后,连一条从v到u的容量为c费用为−d的边,用于退流。 这样就没有负环了。 (节选自:https://www.cnblogs.com/lnzwz/p/12327725.html)
但是,我好像,看懂了,又没完全懂。所以,上图! 比如说,我们有这样一条负边: 那么,他就会变成这样: 我为什么,记住就完了
¶Warning
¶1.踩坑事故
¶1) 数组不要开小了
这是老生常谈的问题,可能导致TLE或RE,一般可以通过极限数据来发现问题。
¶2) 记得开long long
翻车现场 一定一定一定一定记得开long long!
Remember to open long long 開くことを忘れないでくださいlong long Mos harroni të hapni long long ຈືຂໍ້ມູນການເປີດ long long തുറക്കാൻ ഓർമ്മിക്കുക long long ဖွင့်ရန်သတိရပါ long long 記得開long long ចាំបើក long long อย่าลืมเปิด long long Не забудьте открыть long long 여는 것을 기억하십시오 long long
¶3) 把u,v打反,或u,i打反
E.g:
1 |
|
1 |
|