记录编号 144556 评测结果 AAAAAAAAAA
题目名称 [网络流24题] 搭配飞行员 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2014-12-24 07:02:35 内存使用 0.49 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
using namespace std;
const int QWQ=1e8;
int n,n1,i,j,p,zj1,zj2,zj3,zj4,ans=0,ST,SD,sj=1,sj2=0,UU,VV;
int to[20100]={0},ne[20100]={0},w[20100]={0},head[110]={0};
int	zhi[110]={0},D[110]={0};
int QUEUE[110]={0},QUEUE_HEAD=1,QUEUE_TAIL=0;
bool flag[110]={0};
int GET()
{
	int x=QUEUE[QUEUE_HEAD];
	flag[x]=0;
	QUEUE_HEAD++;QUEUE[0]--;
	if(QUEUE_HEAD>105)QUEUE_HEAD=1;
	return x;
}
void PUSH(int x)
{
	QUEUE_TAIL++;QUEUE[0]++;
	if(QUEUE_TAIL>105)QUEUE_TAIL=1;
	QUEUE[QUEUE_TAIL]=x;
	flag[x]=1;
}//队列实现
void ADD(int u,int v)
{
	to[++sj]=v,ne[sj]=head[u],head[u]=sj;w[sj]=1;
	to[++sj]=u,ne[sj]=head[v],head[v]=sj;w[sj]=0;
}
void init()
{
	scanf("%d%d",&n,&n1);
	ST=n+1,SD=n+2;
	while(scanf("%d%d",&zj1,&zj2)!=EOF)
	{
		flag[zj1]=1;
		ADD(zj1,zj2);
	}
	for(i=1;i<=n;i++)
	{
		if(flag[i])ADD(ST,i),flag[i]=0;
		else ADD(i,SD);
	}
}
void flowpush(int x)
{
	while(zhi[x])
	{
		zj2=D[x]-1;zj4=QWQ;
		for(i=head[x];i;i=ne[i])
		if(w[i]>0)
		{
        	if(D[to[i]]==zj2)
        	{
				zj3=min(zhi[x],w[i]);
				zhi[to[i]]+=zj3,zhi[x]-=zj3,w[i]-=zj3,w[i^1]+=zj3;
				if(to[i]!=UU&&to[i]!=VV&&zhi[to[i]])PUSH(to[i]);
				if(!zhi[x])return;
			}
			else if(D[to[i]]<zj4)zj4=D[to[i]];
		}
		D[x]=zj4+1;
	}
}
void flow(int U,int V)
{
	UU=U,VV=V;
	for(i=1;i<=n;i++)zhi[i]=D[i]=0;
	zhi[U]=QWQ,zhi[V]=0,D[U]=V;
	for(i=head[U];i;i=ne[i])
	if(w[i]>0)
	{
		zhi[to[i]]+=w[i];w[i^1]+=w[i],w[i]=0;
		if(to[i]!=V)PUSH(to[i]);
	}
	while(QUEUE[0])
	{
		zj1=GET();
		flowpush(zj1);
	}
}
int main()
{
    //freopen("a.txt","r",stdin);
    freopen("flyer.in","r",stdin);
	freopen("flyer.out","w",stdout);
	init();
	flow(ST,SD);
	ans=zhi[SD];
	printf("%d\n",ans);
	//while(1);
	return 0;
}