【网络流24题-洛谷P2765 魔术球问题】

题目描述

«问题描述:

假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,…的球。

(1)每次只能在某根柱子的最上面放球。

(2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数。

试设计一个算法,计算出在n根柱子上最多能放多少个球。例如,在4 根柱子上最多可放11 个球。

«编程任务:

对于给定的n,计算在n根柱子上最多能放多少个球。

输入输出格式

输入格式:

第1 行有1个正整数n,表示柱子数。

输出格式:

程序运行结束时,将n 根柱子上最多能放的球数以及相应的放置方案输出。文件的第一行是球数。接下来的n行,每行是一根柱子上的球的编号。

输入输出样例

输入样例#1:

输出样例#1:

说明
感谢 @PhoenixEclipse 提供spj

4<=n<=55

本质是一个最小路径覆盖问题。我们枚举答案\(1…k\),每次新增一个球\(k\),则若其与前面的球\(i\)标号之和构成完全平方数,则从\(i\)到\(k\)连一条容量为1的边,这样,每一根柱子可以看成是一条路径,而随着图的扩张,若最小路径覆盖数大于\(n\),则此时所有的\(n\)根柱子最多只能放\(k-1\)个球了,于是\(k-1\)就是答案。做匹配的时候对每个点的匹配点进行记录,在最后的残量网络上根据记录找到每条路径的起点再输出即可。

代码:

 

stdKonjac

stdKonjac

一只挣扎的蒟蒻ACMer

评论太激烈有些评论需要亲动动手指翻页

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

*