网络流专题训练材料收集

我这次上传2本书,还有我写的一个简短的paper。分别是:
《Network Flows - Theory, Algorithms, And Applications》包括习题解答
《Combinatorial optimization:networks and matroids》
"任意图最大加权匹配简单算法.doc"
注:附件里还有一个这两本书的阅读器
我刚开始搞acm时看《Network Flows - Theory, Algorithms, And Applications》这本书,就是为了想提升一下自己英语阅读水平,结果书看完了阅读能力还是很差。
《Combinatorial optimization:networks and matroids》这本书里有些是上面那本书没有的东西
下面介绍一个提纲,其中有介绍复杂度的地方,n表示图的顶点数,m表示图的边数

下面是学习网络流的一些材料和网上的一些题目


第一部分:算法学习
一、初级算法


1.最大流
简单描述:熟悉残余网络这种网络流最基础的表示方法,会写最基本的bfs和dfs找增广路的Ford Fulkerson算法。dfs一般代码要简短一些,但不是多项式算法,用bfs算法是多项式的,最坏复杂度为O(n*m*m),不要过分相信复杂度这个东西而不敢用网络流算法了。学会实用的capacity scaling方法。
参考资料:
 《Network Flows - Theory, Algorithms, And Applications》 P185,算法介绍
 《Network Flows - Theory, Algorithms, And Applications》 P212,capacity scaling方法介绍
推荐题目:
 POJ 1273,随便什么算法只要没写错都可以过
 POJ 1459,如果是写的裸的dfs增广应该会TLE,但是加上两句用上capacity scaling方法使算法变成伪多项式算法就可以AC


2.匹配
简单描述:解决二分图基数匹配的算法,一般直接用bfs或dfs找增广路
参考资料:《Combinatorial optimization:networks and matroids》P195,刚开始学可以找别人代码看看
推荐题目:POJ 1469,POJ 2446,


3.费用流
简单描述:最简单的费用流算法---连续最短路算法,要求这个网络里面不含有负环,若用spfa就可以直接不停的跑就是了,但如何用类似dijkstra这样不能有负权的最短路算法来做,就看看参考资料里面吧。
参考资料:《Network Flows - Theory, Algorithms, And Applications》P321,算法介绍
推荐题目:POJ 2516,POJ 2195,
 
https://www.spoj.pl/problems/COVER,这个题目用spfa写的最短路恐怕跑不过去,还是写个优化过的dijkstra吧


二、中级算法


1.最大流
简单描述:可以选择的有SAP(Shortest Augmenting Path)算法,Dinic算法(和sap其实是差不多的),预留推进算法(Preflow-Push),前两种复杂度为O(n*n*m),预留推进算法大概在(n^3),但是我们选择前两种而不选第3种是因为实际中一般前两种跑得快得多。学会SAP或Dinic是很必要的。然后说一些SAP(Dinic)在解决特殊问题的复杂度:用最大流做二分图基数匹配时候的复杂度为(m*n^0.5),如果最大流每条边容量上限为1,那么复杂度为O(n^(2/3)*m),参见《Network Flows - Theory, Algorithms, And Applications》 P254
参考资料:《Network Flows - Theory, Algorithms, And Applications》P215,介绍SAP算法
推荐题目:POJ 3469


2.匹配
简单描述:解决二分图加权匹配的KM算法,复杂度为O(n^3),但常数比用费用流解决少很多,为1/8左右
参考资料:有几个算法的思想都差不多,可以看《Combinatorial optimization:networks and matroids》P205,具体代码可以在网上找,比如“ACM浙大模板”里面就有
推荐题目:HDOJ 2426,HDOJ 2448


3.费用流
简单描述:如果费用没有为0的边,可以很轻松将最大流的SAP算法改成解费用流的算法,之前的标号现在就记到汇点的距离,这样的费用流速度大概为最短路的两倍。下面的这个算法我感觉还可以,速度和SAP修改过来的差不多
参考资料:
 《Network Flows - Theory, Algorithms, And Applications》P366,relaxation algorithm
推荐题目:暂时没有

三、高级算法


1.最大流
没有,用动态树优化dinic?没必要了吧


2.匹配
一般图的匹配算法:
参考资料:"任意图最大加权匹配简单算法.doc",就在附件中
推荐题目:
 
http://acmicpc-live-archive.uva.es/nuevoportal/data/problem.php?p=4039,经典的中国邮路问题
 CDOJ 1055,小规模的用于测试,(好像题目数据有问题不知道改过来没,数据中有些G[ i ][j]!=G[j][ i ])。


3.费用流
简单描述:网络单纯形算法,算法本身很简单,只是动态维护一颗树的结构和一些数据,达到快速找到并消去负环的目的,该算法在acm中实用价值不高,要写出常数小的优秀代码更不容易。如果拉链表维护这棵树每一个操作都不是问题,但每次复杂度都达到最坏的O(n),我觉得这样写运行效率和之前说的***算法差不多,是连续最短路效率2倍左右,没多少优势。其次是用线索树维护(thread tree),每次复杂度最坏为O(n),但是实现有太多细节要注意(下面参考资料主要就是介绍这种方式的,但最繁琐的地方没有介绍,需要自己琢磨),我写出来的算法的效率大概为直接拉链表的2倍,也就是大概是最原始的连续最短路算法效率的4倍,若做二分图带权匹配由于常数问题效率只有不到KM算法的一半。最后还有一种实现方法,就是使用两种动态树(dynamic tree)维护这些数据,每次消个圈操作复杂度为O(log(n)),但是它常数很大,一般不会有上万个点的费用流让你做。这3种实现代码都相对较大,而且是递增的,因此写出来只是用于刷一些题目的版,其实用性不大,但优势还是有一些的,当流量比较大的时候比连续最短路算法就快多了,它能适应更广的范围,允许边权为负数而不需要进行转化。而如果转化了之后跑最短路一般速度都变得慢多了(要送过去的流量变多了)。
参考资料:《Network Flows - Theory, Algorithms, And Applications》第11章,P402开始
推荐题目:没发现什么题目必须用这个算法


第二部分:模型学习


1.二分图相关的性质:
 简单描述:无奇环性质,最大匹配数等于最小顶点覆盖等等
 参考资料:
 推荐题目:POJ 1325,POJ 1466
 POJ 3715,主要是要按某个字典序求最小顶点覆盖是难点


2.网络流的转化:
 简单描述:如何拆点,如何解决边权为负且有负环,可行流等等。熟练掌握它们是建立网络流模型的基础
 参考资料:
 《Network Flows - Theory, Algorithms, And Applications》P38开始,介绍Network Transformations
 《Network Flows - Theory, Algorithms, And Applications》 P169,介绍可行流问题
 推荐题目:
 POJ 2396,《Network Flows - Theory, Algorithms, And Applications》 P171


3.最小路径覆盖:
 简单描述:这是个很有用的模型,要弄清它的变化,参考资料是按最大流来讲的,可以转化为二分图基数匹配
 参考资料:《Network Flows - Theory, Algorithms, And Applications》P176
 推荐题目:POJ 1422,POJ 2594,
 
http://code.google.com/codejam/contest/dashboard?c=204113#s=p2


4.设计合适的最大流解决问题:
 简单描述:这类题目就是按最大流网络的特点,设计这样的网络满足题意,最后求解即得结果
 参考资料:
 推荐题目:POJ 1087,POJ 1149,HDOJ 3081,


5.设计合适的费用流解决问题:
 简单描述:和上面差不多
 参考资料:
 推荐题目:POJ 3680,《Network Flows - Theory, Algorithms, And Applications》P302


6.最大流最小割定理:
 简单描述:这个定理是最容易出有新意的题的,有时候你看了题目可能根本没往这方面想,因此见题多想想这个定理。关于求出最大流后怎么输出一个割集,只需要从源点bfs或dfs跑一遍所有能到达的点,这样所有一端遍历过,另一端没遍历过的边都是割边。如果要按某种类似字典序输出割集,我只想到按字典序枚举每条边,然后重新判断是否可能在割集里面,注意最大流的中间结果要充分利用,减少重复计算。按字典序输出最大流也是同样道理
 参考资料:《Network Flows - Theory, Algorithms, And Applications》 P185
 推荐题目:POJ 3469, 《Network Flows - Theory, Algorithms, And Applications》P174
 CDOJ 1195,《Combinatorial optimization:networks and matroids》P125
 SRM 465 GreenWarfare
 
http://code.google.com/codejam/contest/dashboard?c=32011#s=p4
第三部分:其它相关内容


1.线性规划
 简单描述:以上介绍的所有内容都是线性规划的子集,上面的所有问题除了任意图匹配外,都可以转化为有多项式个限制条件的线性规划问题,对于上面都不能解决的模型,或许用这个原始的工具就能够解决。它能解决太多的优化问题了,只是在acm中发现必须用它的算法不怎么多。算法用单纯形算法几乎是不二选择,算法真的很简单。
 参考资料:新版《算法导论》中线性规划部分
 推荐题目:
 
http://acmicpc-live-archive.uva.es/nuevoportal/data/problem.php?p=3787,这个题目刘汝佳出的,本意是用网络流怎么变下做,但我不会则用最原始的单纯形做还刷版了
 POJ 2595,POJ 3525,POJ 3335,这几题本意都不是考察线性规划的,拿去水题吧


2.最小平均环(Minimum Mean Cycle Problem)
 简单描述:就是求一个环,这个环的和除以环的边数的平均值要是最小的,可以二分结果然后判断负环,或者专门的算法
 参考资料:
 《Network Flows - Theory, Algorithms, And Applications》P150(二分法),P152(一个专门的算法)
 “任意图最大加权匹配简单算法.doc”第一部分关于找负环的算法
 推荐题目:POJ 2175


3.无向图的最小割边:
 简单描述:就是将一个无向图割成两部分,最小要删除的边数总和。注意这个算法虽然看起来有点像最小生成树算法,但不能解决图中有负权的情况。
 参考资料:
http://docs.google.com/uc?export=download&id=0BwxLvD9mcDNtMjk3MWVkMTAtZjMzNi00ZWE3LTkxYjQtYTQwNzcyZTk3Njk2
 推荐题目:HDOJ 3002,数据出水了,很多错误算法都可以过
最后总结下上面涉及到的题目:
CDOJ:1055,1195
POJ:1087,1149,1273,1325,1422,1459,1466,1469,2175,2195,2396,2446,2516,2594,2595,2679,2949,3335,3469,3525,3680,3715,
HDOJ:2426,2448,3002,3081,
TopCoder:SRM 465 GreenWarfare,
Other:
http://acmicpc-live-archive.uva.es/nuevoportal/data/problem.php?p=3787
http://acmicpc-live-archive.uva.es/nuevoportal/data/problem.php?p=4039
http://code.google.com/codejam/contest/dashboard?c=204113#s=p2
http://code.google.com/codejam/contest/dashboard?c=32011#s=p4
https://www.spoj.pl/problems/COVER

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB遗传算法是一种常用的优化算法,它基于生物进化中的遗传原理,通过模拟生物进化过程来寻找最优解。这门课程将带你入门MATLAB遗传算法的相关知识,让你能够熟练运用该算法解决实际问题。 在课程开始时,我们将介绍遗传算法的基本原理和一些核心概念,例如个体、染色体、基因和适应度函数等。同时,我们会讲解MATLAB中相关的函数和工具箱,帮助你快速上手。 随后,我们将深入探讨遗传算法的操作过程,包括选择、交叉和变异等。通过实例演示和代码实现,你将学会如何设计和优化遗传算法中的这些操作,以提高算法的性能和效果。 在课程的后半部分,我们会重点讲解遗传算法在神经网络优化中的应用。神经网络是一种模拟人类大脑神经元工作原理的数学模型,它在解决复杂问题和模式识别方面具有独特的优势。我们将学习如何使用遗传算法优化神经网络的权重和偏置,以最大程度地提高其性能。 为了帮助你更好地掌握课程内容,我们将提供大量的实例和编程练习。通过实践,你将掌握MATLAB遗传算法的实际应用技巧,并能够通过自主设计和实现解决实际问题。 总之,这门课程将全面介绍MATLAB遗传算法及其在神经网络优化中的应用。相信通过学习,你将能够熟练掌握该算法,为解决实际问题提供有效的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值