Cod sursa(job #553212)

Utilizator cr1st18Cristi cr1st18 Data 13 martie 2011 19:29:03
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;


#define nmax 10000

vector<int> graf[nmax];

int l[nmax];
int r[nmax];
int viz[nmax];
int i,j,n,m,card,e,k;

int cupleaza(int i)
{
	vector<int>::iterator j;
	if(viz[i] == 1)
		return 0;
	
	viz[i] = 1;
	
	for(j = graf[i].begin();j!=graf[i].end();j++)
			if(r[*j] == 0)
			{
				l[i] = *j;
				r[*j] = i;
				return 1;
			}
	for(j = graf[i].begin();j!=graf[i].end();j++)
			if(cupleaza(r[*j]) == 1)
		{
			l[i] = *j;
			r[*j] = i;
			return 1;
		}
	
	return 0;
}


int main()
{
	
	ifstream fin("cuplaj.in");
	ofstream fout("cuplaj.out");
	
	fin>>n>>m>>e;
	
	for(k=1;k<=e;k++)
	{
		fin>>i>>j;
	graf[i].push_back(j);
	}
	
	for(i=1;i<=n;i++)
	{
		if(l[i] == 0)
		{
		for(j=1;j<=n;j++)
			viz[j] = 0;
		card = card + cupleaza(i);
		}
		else
			card++;
	}
	
	fout<<card<<"\n";
	
	for(j=1;j<=m;j++)
		if(r[j]!=0)
			fout<<r[j]<<" "<<j<<"\n";
			
return 0;
}