网络流24题之魔术球问题

luoguP2765魔术球问题,给出n个柱子,要求柱子每次只能从最上面放球,任意相邻两个球之和为完全平方数。球编号为1、2、3....,每个球都必须放,不能不放。求最后能放多少个球,每根柱子上的球分别是什么?

luoguP2765魔术球问题

分析

这算是我做到的网络流问题的第一个变种吧,并不再能一眼看出是网络流了233333.
首先这道题对于每个球,显然可以决策,放在某个柱子还是不放。所以一开始如果不是tag上有网络流24题,大概我就会钻进DP里出不来了吧。仔细想想会发现,dp的话,状态很难存储那么那么多(基本是无法表示的,尤其对于一个球可能能放到多个柱子上)。
所以考虑贪心,贪心的做法就是找到第一个能放的地方放柱子上,放不了就放到新柱子上。然而一方面贪心不会证明正确性(题解似乎有dalao证明了正确性),一方面我是来练网络流的233333

这道题关键的建模在于【最小路径覆盖】,可以把柱子看成是最小路径覆盖数,每个球是点,边要求完全平方数,也就是连边条件。
又知道 最小路径覆盖数字 = 顶点数 - 最大匹配数 , 在这里我们能确定最小路径覆盖数,然后顶点数不断增加,并通过跑匈牙利或最大流求出最大匹配数。 直到顶点数 - 最大匹配数 大于 最小路径覆盖数,就说明此时已经到边界外了,即退出循环即可。
这道题还需要用到的常用套路是,对于有向图的二分图最大匹配,需要【拆点】后,再进行匹配。原因是类似于1->2->3这种情况,如果直接跑匈牙利,是很难跑出答案的,或者跑出的答案很难输出方案。所以我们要拆成1->2 2'->3,这样即可。

最后,做二分图到底该用匈牙利还是dinic呢...?

源代码

贪心

匈牙利算法



本文标题:网络流24题之魔术球问题

文章作者:Xie Keyi

发布时间:2018年10月18日 - 12:10

原始链接:https://xiekeyi98.com/74901417.html

许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 转载请保留原文链接及作者。