记录编号 278337 评测结果 AAAAAAAAAA
题目名称 [网络流24题]魔术球问题(简化版) 最终得分 100
用户昵称 GravatarRapiz 是否通过 通过
代码语言 C++ 运行时间 0.379 s
提交时间 2016-07-07 17:19:24 内存使用 4.16 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
using std::min;
using std::queue;
const int INF=1e9,MAXV=(1600+10)*2,MAXE=2e5; 
int n,ans;
bool square(int a){
	int sq=sqrt(a);
	return a==sq*sq; 
}
struct Dinic{
	struct EDGE{int u,v,c,f;}st[MAXE];
	int s,t,lv[MAXV],nowe[MAXV],head[MAXV],nxt[MAXE],sz;
	Dinic(){
		sz=1;
		s=1600*2+1,t=1600*2+2; 
	}
	void sadd(int u,int v,int c){
		st[++sz].u=u,st[sz].v=v,st[sz].c=c;
		nxt[sz]=head[u],head[u]=sz;
	} 
	void add(int u,int v){
		sadd(u,v,1),sadd(v,u,0);
	}
	bool bfs(){
		memset(lv,0,sizeof(lv));
		lv[s]=1;
		queue<int> q;
		q.push(s);
		while(!q.empty()) {
			int u=q.front();q.pop();
			for(int e=head[u];e;e=nxt[e]) if(st[e].c>st[e].f&&!lv[st[e].v])  lv[st[e].v]=lv[u]+1,q.push(st[e].v);
		}
		return lv[t];
	}
	void clnowe(){
		for(int i=1;i<=MAXV;i++) nowe[i]=head[i];
	}
	int dfs(int u,int a){
		if(u==t) return a;
		int flow=0,f;
		for(int& e=nowe[u];e;e=nxt[e]) if(st[e].c>st[e].f&&lv[st[e].v]==lv[u]+1&&(f=dfs(st[e].v,min(st[e].c-st[e].f,a)))){
			flow+=f,st[e].f+=f,st[e^1].f-=f,a-=f;
			if(!a) break;
		}
		if(!a) lv[u]=-1;
		return flow;
	}
	int maxf(){
		static int flowg=0;
		while(bfs()) clnowe(),flowg+=dfs(s,INF);
		//printf("%d\n",flowg);
		return flowg;
	}
	int minpath(){
		add(s,ans),add(ans+1600,t);
		for(int i=1;i<ans;i++) if(square(i+ans)) add(i,ans+1600);//,printf("%d->%d\n",i,ans);
		return ans-maxf();
	}
}foo;
int main(){
	freopen("balla.in","r",stdin);
	freopen("balla.out","w",stdout);
	scanf("%d",&n);
	for(ans=1;ans<=1600;ans++) if(foo.minpath()>n) break;
	printf("%d",ans-1);
}