Cod sursa(job #535682)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 17 februarie 2011 17:04:18
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int NV=20001,N=20005,INF=1000000000;
int nrp,n,m,dist[N],per[N];
vector<int> L[N];
queue<int> Q;
void read()
{
	int x,y,nrm;
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	scanf("%d%d%d",&n,&m,&nrm);
	for(int i=1;i<=nrm;i++)
	{
		scanf("%d%d",&x,&y);
		L[x].push_back(n+y);
	}
}
void init()
{
	for(int i=1;i<=n;i++)
		per[i]=NV;
	for(int i=1;i<=m;i++)
		per[n+i]=NV;	
	nrp=0;
}
bool BFS()
{
	for(int i=1;i<=n;i++)
		if(per[i]==NV)
			dist[i]=0, Q.push(i);
		else dist[i]=INF;
	dist[NV]=INF;
	while(!Q.empty())
	{
		int nod=Q.front();
		Q.pop();
		if(nod!=NV)
			for(vector<int>::iterator it=L[nod].begin();it!=L[nod].end();it++)
				if(dist[per[*it]]==INF)
				{
					dist[per[*it]]=dist[nod]+1;
					Q.push(per[*it]);
				}
	}
	return dist[NV]!=INF;
}
bool DFS(int nod)
{
	if(nod!=NV)
	{
		for(vector<int>::iterator it=L[nod].begin();it!=L[nod].end();it++)
			if(dist[per[*it]]==dist[nod]+1)
				if(DFS(per[*it]))
				{
					per[*it]=nod;
					per[nod]=*it;
					return true;
				}
		dist[nod]=INF;
		return false;
	}
	return true;
}
void karp()
{
	init();
	while(BFS())
	{
		for(int i=1;i<=n;i++)
			if(per[i]==NV && DFS(i))
				nrp++;				
	}
}
void afis()
{
	printf("%d\n",nrp);
	for(int i=1;i<=n;i++)
		if(per[i]!=NV)
			printf("%d %d\n",i,per[i]-n);
}
int main()
{
	read();
	karp();
	afis();
	return 0;
}