rt
代码:
#include<bits/stdc++.h>
#define inf 114514
using namespace std;
void IOS()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
return;
}
struct Edge
{
int zd,nxt,w;
}ed[20005];
int n,m,s,t,d,cnt,u,v;
int hd[1005],dep[1005],dqh[1005];
bool mp[505][505];
void set_edge(int u,int v)
{
cnt++;
ed[cnt].zd=v;
ed[cnt].w=1;
ed[cnt].nxt=hd[u];
hd[u]=cnt;
cnt++;
ed[cnt].zd=u;
ed[cnt].w=0;
ed[cnt].nxt=hd[v];
hd[v]=cnt;
return;
}
bool bfs(int x)
{
for(int i=1;i<=n;i++) dep[i]=inf;
dep[x]=0;
queue<int> q;
dqh[x]=hd[x];
q.push(x);
while(!q.empty())
{
int p=q.front();
q.pop();
for(int i=hd[p];i;i=ed[i].nxt)
{
int kkk=ed[i].zd;
if(dep[kkk]!=inf||!ed[i].w) continue;
dqh[kkk]=hd[kkk];
dep[kkk]=dep[p]+1;
q.push(kkk);
if(kkk==t) return 1;
}
}
return 0;
}
int dfs(int x,int maxx)
{
if(x==t) return maxx;
int k,sm=0;
for(int i=dqh[x];i&&(maxx>0);i=ed[i].nxt)
{
dqh[x]=i;
int p=ed[i].zd;
if(ed[i].w==0||dep[p]!=dep[x]+1) continue;
k=dfs(p,min(maxx,ed[i].w));
if(k==0) dep[p]=inf;
ed[i].w-=k;
ed[i^1].w+=k;
maxx-=k;
sm+=k;
}
return sm;
}
int dinic()
{
int sm=0;
while(bfs(s)) sm+=dfs(s,inf);
return sm;
}
int main()
{
IOS();
cin>>n>>m>>d;
cnt=1;
s=1;
t=n+m+2;
for(int i=1;i<=n;i++) set_edge(s,i+1);
for(int i=1;i<=d;i++)
{
cin>>u>>v;
if(!mp[u][v]&&u<=n&&v<=m)
{
mp[u][v]=1;
set_edge(u+1,v+n+1);
}
}
for(int i=1;i<=m;i++) set_edge(i+n+1,t);
cout<<dinic()<<endl;
return 0;
}