Cod sursa(job #441612)

Utilizator mordredSimionescu Andrei mordred Data 12 aprilie 2010 23:36:34
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
// Simionescu Andrei, -/-/2010
// http://infoarena.ro/problema/cuplaj
// Dificultate: - 
// Categorii: -

#include <cstdio>
#include <string>
#include <vector>
using namespace std;

#define NMAX 10005
	
int n, m, M, L[NMAX], R[NMAX], visited[NMAX];
vector<int> graf[NMAX];

void input();
int pairup(int);
void solve();


int main(){
	freopen( "cuplaj.in", "r", stdin );
	freopen( "cuplaj.out", "w", stdout );
	
	input();
	solve();
	
	
	return 0;
}

void input()
{
	scanf( "%d %d %d", &n, &m, &M);
	int x, y;
	for(; M; --M )
	{
		scanf("%d %d", &x, &y);
		graf[x].push_back(y);
	}
}

int pairup(int nod)
{
	if(visited[nod])
		return 0;
		
	visited[nod] = 1;
	for(int i = 0; i < graf[nod].size(); ++i)
		if( !R[graf[nod][i]] )
		{
			L[nod] = graf[nod][i];
			R[graf[nod][i]] = nod;
			return 1;
		}
		
	for(int i = 0; i < graf[nod].size(); ++i )
		if( pairup(R[graf[nod][i]]) )
		{
			R[graf[nod][i]] = nod;
			L[nod] = graf[nod][i];
			return 1;
		}
	
	return 0;
}

void solve()
{
	int ok = 0, cuplaj = 0;
	do{
		ok = 0;
		memset(visited, 0, sizeof(visited));
		
        for(int i = 1; i <= n; ++i)
		if(!L[i] && pairup(i))
		{
			++cuplaj;
			ok = 1;
		}
	} while(ok);
	
	printf("%d\n", cuplaj);
	
    for(int i = 1; i <= n; ++i)
		if( L[i] )
			printf("%d %d\n", i, L[i]);
}