Cod sursa(job #862238)

Utilizator cahemanCasian Patrascanu caheman Data 22 ianuarie 2013 14:31:26
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<cstdio>
#include<vector>

using namespace std;

bool viz[10005];
int ns, nd, ms[10005], md[10005];
vector <int> muchiigraf[10005];

bool dfs(int nod)
{
	int i;
	if(viz[nod])
		return 0;
	viz[nod] = 1;
	
	for(i = 0; i < muchiigraf[nod].size(); ++i)
		if(md[muchiigraf[nod][i]] == 0 || dfs(md[muchiigraf[nod][i]]))
		{
			ms[nod] = muchiigraf[nod][i];
			md[muchiigraf[nod][i]] = nod;
			return 1;
		}
	return 0;	
}


int main()
{
  freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);
  int mc, i, j, x, y, nr = 0, ok; 
	scanf("%d%d%d", &ns, &nd, &mc);
	for(i = 1; i <= mc; ++ i)
	{
		scanf("%d%d", &x, &y);
		muchiigraf[x].push_back(y);
	}
	for(i = 1; i <= ns; ++ i)
	{
		ok = 1;
		while(ok)
		{
			ok = 0;
			for(j = 1; j <= ns; ++ j)
				viz[j] = 0;
			if(dfs(i))
			{
				if(! ms[i])
				  ok = 1;
				++ nr;
			}
	  }
	}
	printf("%d\n", nr);
	for(i = 1; i <= ns; ++ i)
		if(ms[i])
	    printf("%d %d\n", i, ms[i]);
	return 0;
}