Cod sursa(job #1436827)

Utilizator avaspAva Spataru avasp Data 16 mai 2015 14:52:14
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#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;
}