HDU 2063 裸奔的二分图最大匹配

时间:2021-03-30 21:07:23

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <string>
#include <queue>
#include <stack>
#include <cstring>
#define CL(a,b) memset(a,b,sizeof(a))
#define ll __int64
#define TEST cout<<"TEST ***"<<endl;
#define INF 0x7ffffff0
#define MOD 1000000007
using namespace std;

typedef struct mynode
{
int v,next;
}N;
N node[110010];
int head[1510],ct,k,m,n;
int isv[1510],link[1520];

void inithead()
{
CL(head,-1);
ct=0;
}

void addnode(int s,int e)
{
node[ct].v=e;node[ct].next=head[s];head[s]=ct++;
}

int edmonds(int x)
{
int p=head[x];
int v;
while(p!=-1)
{
v=node[p].v;
if(isv[v]==0)
{
isv[v]=1;
if(link[v]==-1||edmonds(link[v]))
{
link[v]=x;
return 1;
}
}
p=node[p].next;
}
return 0;
}

int main()
{
while(scanf("%d",&k)&&k!=0)
{
scanf("%d %d",&m,&n);
int i,j;
inithead();
int a,b;
for(i=0;i<k;i++)
{
scanf("%d %d",&a,&b);
addnode(a,b);
}
int rem=0;
CL(link,-1);
for(i=1;i<=m;i++)
{
CL(isv,0);
rem+=edmonds(i);
}
printf("%d\n",rem);
}
return 0;
}