SPOJ 371 BOXES 附带最终版MCMF模板

非常感谢这道题,准确的来说应该是这道题的数据。这道题其实是很简单的。 题意: 一堆箱子围成一个圈,每个箱子里面初始没有或有几个球。要求最后每个箱子里面最多一个球。每次转移球只能转移到相邻的箱子,转移一个球,需要花费1。问最小花费。 思路: 最暴力的思路是每个球对其他所有球都建立一条边,费用为最短距离。 但是有个显然的特点是,a -> b 与 a-> k , k-> b 的花费是相同的。所以我们只要在相邻的箱子建边即可。容量 inf ,费用为 1 。 建立源点连接有球的箱子,容量为 球 数,花费为 0 。箱子到汇点容量为 1 ,花费为 0 。 AC Code #include #include #include #include #include #include #include using namespace

CSU 1506 Double Shortest Paths

算是康复福利了,以前没做过,但是实际是非常水的题目,应该可以作为入门题了 诡异的是 这道题description莫名奇妙没了。 题意: 两个人从 1 -> n ,每条路径最多走两次,走第一次为 d ,走第二次为 d+a ,问最短的路径。 思路: 对于一组数据,建两次边即可。容量为1,花费分别为 d , d + a。 源点流入1 容量为 2 , 花费 0 n流入汇点 容量 2 ,花费 0 注: 给定的边为有向边 AC code #include #include #include #include #include using namespace std; const int

POJ 2135 Farm Tour

康复计划之 最小费用最大流 以前写的是直接在网上拿了一个模板,直接套了A…… 这次好好在纸上模拟了一下,理解了一下。 最小费用最大流的增广路算法简单说就是不断求最短路(因为残量网络和反向边的存在),记录最短路,再进行流量处理,直到最后不存在通路,则停止。 下面是一个 入门题 题意: 给你一张图,要你从1 -> n 再从 n -> 1 不能走重复的路径。问你最短方案。 思路: 其实就是找出最短和次短的 1 -> n 的路径,当然路径不允许任何重叠。 单纯的两次spfa是不可行的。因为第一次最短路很可能会把通路断掉。 AC Code #include #include #include #include #include using namespace std; const int inf = 99999999; const int