Cod sursa(job #398752)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 19 februarie 2010 12:08:15
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<stdio.h>
#include<vector>
#define Nmax 10010
using namespace std;

int n,m,E,dr[Nmax],st[Nmax],viz[Nmax],i,j,sol,x,y,ok;
vector <int> G[Nmax];

int cupleaza(int nod)
{
	int i,N=G[nod].size(),fiu;
	
	if(viz[nod]) return 0;
	viz[nod]=1;

	for(i=0;i<N;i++)
	{
		fiu=G[nod][i];
		if( !dr[fiu] || cupleaza(dr[fiu]) )
		{
			st[nod]=fiu;
			dr[fiu]=nod;
			return 1;
		}
	}
	return 0;
}

int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	
	scanf("%d %d %d",&n,&m,&E);
	
	for(i=1;i<=E;i++)
	{
		scanf("%d %d",&x,&y);
		
		G[x].push_back(y);
	}
ok=1;	
while(ok)
{
ok=0;	
	for(i=1;i<=n;i++)
	{
		if(st[i]) continue;
		
		if( cupleaza(i) ) ok=1,sol++;
		else
		{
			memset(viz,0,sizeof(viz));
			if( cupleaza(i) ) ok=1,sol++;
		}
	}
}
	printf("%d\n",n-sol);
	
	for(i=1;i<=n;i++)
		if(st[i]) printf("%d %d\n",i,st[i]);

	return 0;
}