魔术球问题(网络流24题)
问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球。 (1)每次只能在某根柱子的最上面放球。 (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数。 试设计一个算法,计算出在n根柱子上最多能放多少个球。例如,在4 根柱子上最多可放11 个球。 «编程任务: 对于给定的n,计算在n根柱子上最多能放多少个球。 题解 考虑到当球的数量增加时柱子数量不严格单增,所以可以一个一个加球判定需要几个柱子装得下。 把每个球拆成两个点,互成平方数的两个球左右连边,为了确保只连一次从大的向小的连边。 那么问题就变成了最小路径覆盖,路径数就是柱子数。 枚举球为m个,当路径数大于柱子数时答案就是m-1,至于输出方案就从1遍历路径就好了。 为了不超时,我们新加一个球,就从这个球跑一次增广路即可,这也是为什么从大的往小的连边。 #include<bits/stdc++.h> using namespace std; const int maxn=3605; int n,m; int vis[maxn],match[maxn],timer; bool square[maxn<<1]; vector<int> e[maxn]; void init(){ timer=0; memset(match,0,sizeof(match)); memset(vis,0