您的位置:首页 > 理论基础 > 计算机网络

【网络流24题----04】魔术球问题

2017-01-29 22:42 316 查看
问题描述:
假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为 1,2,3,4......的球。
(1)每次只能在某根柱子的最上面放球。
(2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数。
试设计一个算法,计算出在n根柱子上最多能放多少个球。例如,在4 根柱子上最多可
放11个球。
´编程任务:
对于给定的n,计算在 n根柱子上最多能放多少个球。

´数据输入:
文件第1 行有 1个正整数n,表示柱子数。
´结果输出:
文件的第一行是球数。

数据规模

n<=60 保证答案小于1600

输入文件示例

4

输出文件示例

11

方案如下

1 8
2 7 9
3 6 10
4 5 11

每一行表示一个柱子上的球

如果不要输出方案好题立马变水题(可以用式子直接输出答案)

假设我不知道式子:问题变成最小路径覆盖,并且路径不能相交,如果一个数加上一个比他大的数是完全平方数,直接连有向边即可。

枚举答案,每次往如图中放入一个点,然后再残量网络上继续更新答案,判断所需路径数是否>n即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 5000
#define llg int
#define inf (llg)1e16
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg m,r[maxn],c[maxn],tot,k,N=4999;

struct DINIC
{
vector<llg>a[maxn],ba[maxn],val[maxn];
llg dl[maxn],deep[maxn],bj[maxn];

void insert(llg x,llg y,llg z)
{
a[x].push_back(y),val[x].push_back(z);
a[y].push_back(x),val[y].push_back(0);
ba[x].push_back(a[y].size()-1); ba[y].push_back(a[x].size()-1);
}

void in(llg x)
{
for (llg i=1;i<x;i++)
if (floor(sqrt(i+x))*floor(sqrt(i+x))==x+i)

{
insert(i*2,x*2-1,1);
}
insert(0,x*2,1);
insert(x*2-1,N,1);
}

llg dfs(llg x,llg low)
{
llg va=0,inc=0;
if (x==N) return low;
llg w=a[x].size();
for (llg i=0;i<w;i++)
if (deep[x]+1==deep[a[x][i]] && val[x][i]>0 && (va=dfs(a[x][i],min(low,val[x][i]))))
{
val[x][i]-=va; val[a[x][i]][ba[x][i]]+=va; inc+=va;
return va;
}
if (!inc) deep[x]=-1;
return 0;
}

void fencen()
{
llg x,w,v; deep[0]=0;
memset(bj,0,sizeof(bj));
llg head=0,tail=1; dl[1]=0; bj[0]=1;
do
{
x=dl[++head]; w=a[x].size();
for (llg i=0;i<w;i++)
{
v=a[x][i];
if (bj[v] || val[x][i]<=0) continue;
dl[++tail]=v;
deep[v]=deep[x]+1; bj[v]=1;
}
}while (head!=tail);
}

llg dinic()
{
llg ans=0;
while (1)
{
fencen();
if (!bj
) break;
ans+=dfs(0,inf);
}
return ans;
}
}G;

int main()
{
yyj("balla");
llg up; cin>>up;
for (llg i=1;;i++)
{
G.in(i);
tot+=G.dinic();
if (i-tot>up){cout<<i-1; return 0;}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: