我们一起网络流,一起流流流流流

其实是昨天上游戏引擎的课的时候旁边的同学给我看了这个图……

是真的.jpg

所以说啊,上课的时候不要搞这些有的没的,除非对扑克脸很有自信。

清明在即,除了提前挖个洞准备把自己埋起来之外,还是要准备一下ICPC昆明站……可是我们队里有大腿了,刷点网络流题验一验板子想必也是不错的。

大家最喜欢的网络流24题,到底能不能刷完呢——

P6000 – 搭配飞行员

这是一道经典的二分图匹配。

除了使用匈牙利算法之外,最大流也是可以解决这个问题的。

匈牙利算法的整体复杂度是 [latex]O(VE)[/latex] ,实际上会更小一点。

最大流(Dinic)的话可以把它降到 [latex]O(V \sqrt E)[/latex]。当然写还是前者更好写啦。

P6001 – 太空飞行计划

这题是一个最大权闭合子图,之前大概也写过三次(但不是三题)。

什么是闭合子图呢?和一个点相连的所有点也要在这个子图里,是谓闭合子图。最大权自然就是点全之和最大。

解法是对于正点权点,连S到它的边;对于负点权点,连它到T的边。流量取点权的绝对值。

对于原图的所有边,同样连边,流量取正无穷。

最大权值和 = 所有正点权之和 – 最小割,证明略。

网络流的割,就是把图切成两个子图使其不再连通。最小割就是切掉的边的权值和最小的割。

求最小割就是跑最大流。

如果只是这样的话,套板子也就过了,但是它要求输出方案。

那么我们可以跑完最大流之后从S开始DFS,给相连的点打上标记。所有和S相连的点,再加上所有和T不相连的点,就是所取的点。证明略。

(本菜鸡写证明略不是因为懒得写而是真的不会)

P6002 最小路径覆盖

路径……就是那么个路径;覆盖……就是若干条路径加起来能覆盖这个图。最小就是要让路径条数最少,并且本题中不允许顶点相交。

考虑最开始每个点自己单独一条路径,那么我们要做的就是把不同的路径连起来。每个点拆成两个点之后(这两个点不连边)照原图建图,跑二分图最大匹配:每匹配到一条边,路径总数就减少1。

1-2‘和2-3’被连起来了,所以是1-2-3和4

跑完最大流之后回去看看哪些正向边的flow是0,这些就是我们的最终方案中包含的边。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注