Cod sursa(job #663663)

Utilizator Catah15Catalin Haidau Catah15 Data 18 ianuarie 2012 20:16:57
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

#define maxN 10005
#define PB push_back

vector <int> list[maxN];
int DR[maxN], ST[maxN];
bool viz[maxN];


bool cupleaza (int nod)
{
	if (viz[nod]) return false;
	viz[nod] = true;
	
	for (unsigned int i = 0; i < list[nod].size(); ++ i)
	{
		int y = list[nod][i];
		
		if (! DR[y] || cupleaza (DR[y]))
		{
			ST[nod] = y;
			DR[y] = nod;
			
			return true;
		}
	}
	
	return false;
}


int main()
{
	freopen ("cuplaj.in", "r", stdin);
	freopen ("cuplaj.out", "w", stdout);
	
	int NS, ND, M;
	
	scanf ("%d %d %d", &NS, &ND, &M);
	
	while (M --)
	{
		int x, y;
		
		scanf ("%d %d", &x, &y);
		
		list[x].PB (y);
	}
	
	int cuplaj = 0;
	bool ok = true;
	
	while (ok)
	{
		ok = false;
		for (int i = 1; i <= NS; ++ i) viz[i] = false;
		
		for (int i = 1; i <= NS; ++ i)
			if (! ST[i] && cupleaza (i)) cuplaj ++, ok = true;
 	}
	
	printf ("%d\n", cuplaj);
	
	for (int i = 1; i <= NS; ++ i)
		if (ST[i]) printf ("%d %d\n", i, ST[i]);
	
	return 0;
}