Cod sursa(job #1131725)

Utilizator span7aRazvan span7a Data 1 martie 2014 07:44:03
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
struct nod{int inf;nod* leg;};
typedef nod* PNod;
PNod L[100001];
void add(int a,int b)
{
	PNod p=new nod;
	p->inf=b;
	p->leg=L[a];L[a]=p;
}
int viz[10001],marc1[10001],marc2[10002],nr,E,n,m;
int potrivire(int i)
{
	PNod p;
	if(viz[i])return 0;
	viz[i]=1;
	for(p=L[i];p;p=p->leg)
	{
		if(!marc2[p->inf])
		{
			marc1[i]=p->inf;
			marc2[p->inf]=i;
			return 1;
		}
	}
	
	for(p=L[i];p;p=p->leg)
	{
		if(potrivire(marc2[p->inf]))
		{
			marc1[i]=p->inf;
			marc2[p->inf]=i;
			return 1;
		}
	}
	return 0;
}
int main()
{	
	int a,b,i;
	f>>n>>m>>E;
	for(i=1;i<=E;i++)
	{
		f>>a>>b;
		add(a,b);
	}
int 	terminat=1;
	while(terminat)
	{
		terminat=0;
		memset(viz,0,sizeof(viz));
		for(i=1;i<=n;i++)
			if(!marc1[i])terminat+=potrivire(i);
		
	}
	nr=0;
	for(i=1;i<=n;i++)
		if(marc1[i])nr++;
	g<<nr<<'\n';
	
		for(i=1;i<=n;i++)
			if(marc1[i])g<<i<<" "<<marc1[i]<<"\n";
	
	return 0;
}