魔术球问题
题面:
假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,…的球。
(1)每次只能在某根柱子的最上面放球。
(2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数。
试设计一个算法,计算出在n根柱子上最多能放多少个球。例如,在4 根柱子上最多可放11 个球。
«编程任务:
对于给定的n,计算在n根柱子上最多能放多少个球。
4<=n<=55
思路: 我们可以转换一下思路,若是给你球的数量,问你至少需要多少个柱子,就变成了最小路径覆盖问题了,将每个球拆点,且若两个数之和为完全平方数就连边。然后我们可以逐步加边跑最大流,直至需要符合要求,我们需要求到(n+1)根柱子需要多少个球,再减掉1个就是n根柱子最多有多少个球
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int N = 10005;
int n, m, ss, tt;
int dis[N];
int cur[N];
queue<int> q;
int mark[N],to[N];
struct Edge {
int to;
int value;
int next;
} e[N * 8];
int head[N], cnt = -1;
void add(int from, int to, int value) {
cnt++;
e[cnt].to = to;
e[cnt].value = value;
e[cnt].next = head[from];
head[from] = cnt;
}
bool bfs(int s, int t) {
q = queue<int>