Cod sursa(job #871078)

Utilizator Catah15Catalin Haidau Catah15 Data 4 februarie 2013 13:34:30
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

#define maxN 10010
#define PB push_back

int ST[maxN], DR[maxN];
int cuplaj;
bool Viz[maxN];
vector <int> G[maxN];


bool cupleaza (int X)
{
	if (Viz[X]) return false;
	Viz[X] = true;
	
	vector <int> :: iterator it;
	
	for (it = G[X].begin(); it != G[X].end(); ++ it)
		if (! ST[*it] || cupleaza (ST[*it]))
		{
			ST[*it] = X;
			DR[X] = *it;
			return true;
		}
	
	return false;
}


int main()
{
	freopen ("cuplaj.in", "r", stdin);
	freopen ("cuplaj.out", "w", stdout);
	
	int N, M, E;
	
	scanf ("%d %d %d", &N, &M, &E);
	
	while (E --)
	{
		int u, v;
		
		scanf ("%d %d", &u, &v);
		
		G[u].PB (v);
	}
	
	bool ok = true;
	
	while (ok)
	{
		ok = false;
		memset (Viz, false, sizeof (Viz));
		
		for (int i = 1; i <= N; ++ i)
			if (! DR[i] && cupleaza (i)) ++ cuplaj, ok = true;
	}
	
	printf ("%d\n", cuplaj);
	for (int i = 1; i <= N; ++ i) if (DR[i]) printf ("%d %d\n", i, DR[i]);
	
	return 0;
}