题目链接
过山车
代码如下
#include<bits/stdc++.h>
using namespace std;
const int M = 502;
int k,m,n;
int g[2*M][2*M],link[M];
bool vis[M];
bool dfs(int u)
{
for(int v = 1;v<=n;v++)
if(g[u][v]&&!vis[v])
{
vis[v] = true;
if(link[v]==-1||dfs(link[v]))
{
link[v] = u;return true;
}
}
return false;
}
int hungary()
{
int res = 0;memset(link,-1,sizeof link);
for(int u = 1;u<=m;u++)
{
memset(vis,false,sizeof vis);
if(dfs(u)) ++res;
}
return res;
}
int main ()
{
int u,v;
while(scanf("%d",&k),k)
{
scanf("%d%d",&m,&n);memset(g,0,sizeof g);
while(k--)
{
scanf("%d%d",&u,&v);
g[u][v] = 1;
}
printf("%d\n",hungary());
}
return 0;
}