记录编号 258373 评测结果 AAAAAAAAAA
题目名称 [网络流24题]魔术球问题(简化版) 最终得分 100
用户昵称 Gravatar粘粘自喜 是否通过 通过
代码语言 C++ 运行时间 2.017 s
提交时间 2016-05-05 18:42:40 内存使用 1.78 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int inf=1000000000;
const int maxn=20000,maxm=50000;
int squ[maxn];
int cur[maxn];
struct Edge{
	int v,f,nxt;
};
int n,src,sink;
int g[maxn+10];
int nume;

Edge e[maxm*2+10];
void addedge(int u,int v,int c){
	e[++nume].v=v;
	e[nume].f=c;
	e[nume].nxt=g[u];
	g[u]=nume;
	e[++nume].v=u;
	e[nume].f=0;
	e[nume].nxt=g[v];
	g[v]=nume;
}
void init()
{
	memset(g,0,sizeof(g));
	nume=1;
}
queue<int> q;
bool vis[maxn+10];
int dist[maxn+10];
inline void bfs()
{
	memset(dist,0,sizeof(dist));
	while(!q.empty()) q.pop();
	vis[src]=true;
	q.push(src);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=g[u];i;i=e[i].nxt)
			if(e[i].f&&!vis[e[i].v]){
				q.push(e[i].v);
				dist[e[i].v]=dist[u]+1;
				vis[e[i].v]=true;
			}
	}
	
}
inline int dfs(int u,int delta){
	if(u==sink){
		return delta;
	}else{
		int ret=0;
		for(int i=g[u];delta&&i;i=e[i].nxt)
			if(e[i].f&&dist[e[i].v]==dist[u]+1){
				int dd=dfs(e[i].v,min(e[i].f,delta));
				e[i].f-=dd;
				e[i^1].f+=dd;
				delta-=dd;
				ret+=dd;
						}
				return ret;
	}
}
int Dinic()
{
	int ret=0;
	while(1){
		memset(vis,0,sizeof(vis));
		bfs();
		if(!vis[sink]) return ret;
		ret+=dfs(src,inf);
	}
}
int main()
{
	freopen("balla.in","r",stdin);
	freopen("balla.out","w",stdout);
	int n,i,j,k;
	for(i=1;i*i<4001;i++)  
        squ[i*i]=1;  
    scanf("%d",&n);
    
        init();  
        src=0;sink=1;  
        for(i=1;i<4001;i++){  
            addedge(src,i<<1,1),addedge((i<<1)+1,sink,1);  
            for(j=1;j<i;j++)  if(squ[j+i])  
                addedge(j<<1,(i<<1)+1,1); 
				for(k=0;k<nume;k+=2)  
                e[k].f+=e[k^1].f,e[k^1].f=0;   
            if(i-Dinic()>n) break;  
        }  
        printf("%d\n",i-1); 
    return 0;  
}