洛谷 3386 二分圖匹配模板 匈牙利演算法
阿新 • • 發佈:2019-02-15
模板
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=2000001;
int fst[MAXN],nxt[MAXN],ss[MAXN];
bool vis[MAXN];
int n,m,e,tot,cnt;
struct hh
{
int from,to;
}ma[MAXN];
void build(int f,int t)
{
tot++;
ma[tot]=(hh){f,t};
nxt[tot]=fst[f];
fst[f]=tot;
return ;
}
bool dfs(int x)
{
for(int i=fst[x];i;i=nxt[i])
{
int v=ma[i].to;
if(!vis[v])
{
vis[v]=1;
if(!ss[v] || dfs(ss[v]))
{
ss[v]=x;
return true;
}
}
}
return false;
}
void solve()
{
scanf ("%d%d%d",&n,&m,&e);
for(int i=1;i<=e;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(x>n || y>m) continue;
build(x,y);
}
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i)) cnt++;
}
cout<<cnt;
}
int main()
{
solve();
return 0;
}