来自裸题:过山车 HDU - 2063
代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main
{
final static int maxn=1005;
final static int maxx=2005;
final static int INF =0x3f3f3f3f;
static int cnt;
static int head[]=new int[maxn];
static int to[]=new int[maxx],next[]=new int[maxx];
static void addEdge(int x,int y)
{
to[++cnt]=y;next[cnt]=head[x];head[x]=cnt;
to[++cnt]=x;next[cnt]=head[y];head[y]=cnt;
}
static int match[]=new int[maxn];
static boolean vis[]=new boolean[maxn];
static void init()
{
Arrays.fill(match, 0);
Arrays.fill(head, 0);
cnt=0;
}
static boolean M(int u)
{
for(int i=head[u];i>0;i=next[i])
{
int v=to[i];
if(vis[v])
continue;
vis[v]=true;
if(match[v]==0||M(match[v]))
{
match[v]=u;
match[u]=v;
return true;
}
}
return false;
}
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
for(;;)
{
int k=sc.nextInt();
if(k==0)break;
int n=sc.nextInt();
int m=sc.nextInt();
init();
while(k-->0)
{
int x=sc.nextInt();
int y=sc.nextInt()+n;
addEdge(x,y);
}
int ans=0;
for(int i=1;i<=n+m;i++)
{
if(match[i]==0)
{
Arrays.fill(vis, false);
if(M(i))ans++;
}
}
System.out.println(ans);
}
}
}