Pagini recente » Cod sursa (job #2791035) | Cod sursa (job #2708921) | Cod sursa (job #1949266) | Cod sursa (job #2509703) | Cod sursa (job #1436827)
#include<cstdio>
#include<vector>
#include<cstring>
#include<cassert>
using namespace std;
vector<int>v[20005];
int n,n1,n2,m,a1,b,a[2001][2001],pred[20005],coada[20005];
bool viz[20005];
bool bfs(int nod){
int ic,sf;
ic=1;
sf=1;
coada[ic]=nod;
viz[nod]=true;
while(ic<=sf){
for(int i=0;i<v[coada[ic]].size();i++){
int e=v[coada[ic]][i];
if(viz[e]==false&&a[coada[ic]][e]!=0&&e!=n){
sf++;
coada[sf]=e;
pred[e]=coada[ic];
viz[e]=true;
if(e>n1&&a[e][n]>0)
viz[n]=true;
}
}
ic++;
}
return viz[n];
}
void update(int nod){
int nnod=nod,val;
val=101;
while(pred[nod]!=-1){
if(a[pred[nod]][nod]<val)
val=a[pred[nod]][nod];
nod=pred[nod];
}
nod=nnod;
while(pred[nod]!=-1){
a[pred[nod]][nod]-=val;
a[nod][pred[nod]]+=val;
nod=pred[nod];
}
}
int main(){
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d%d%d",&n1,&n2,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&a1,&b);
v[a1].push_back(b+n1);
v[b+n1].push_back(a1);
a[a1][b+n1]=1;
}
for(int i=1;i<=n1;i++){
v[0].push_back(i);
v[i].push_back(0);
a[0][i]=1;
}
for(int i=n1+1;i<=n1+n2;i++){
v[n1+n2+1].push_back(i);
v[i].push_back(n1+n2+1);
a[i][n1+n2+1]=1;
}
n=n1+n2+1;
for(int i=0;i<=n;i++)
pred[i]=-1;
while(bfs(0)==true){
for(int i=0;i<v[n].size();i++)
if(viz[v[n][i]]==true&&a[v[n][i]][n]>0){
pred[n]=v[n][i];
update(n);
}
for(int i=0;i<=n;i++)
pred[i]=-1;
memset(viz,0,sizeof(viz));
}
int tot;
for(int i=0;i<n;i++)
tot+=a[i][n];
printf("%d",tot);
return 0;
}