Cod sursa(job #481421)

Utilizator ilincaSorescu Ilinca ilinca Data 31 august 2010 17:34:29
Problema Felinare Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <cstring>
#include <vector>

#define nmax 8195

using namespace std;

int n, m, a [nmax], b [nmax];
bool v [nmax], s [2*nmax];
vector <int> g [nmax];


bool pairup (int k)
{
	v [k]=true;
	vector <int> :: iterator i;
	for (i=g [k].begin (); i != g [k].end (); ++i)
		if (a [*i] == 0)
		{
			a [*i]=k;
			b [k]=*i;
			return true;
		}
	for (i=g [k].begin (); i != g [k].end (); ++i)
		if (v [*i] == false && pairup (a [*i]))
		{
			a [*i]=k;
			b [k]=*i;
			return true;
		}
	return false;
}

int cuplaj ()
{
	bool ok=true;
	int i, r=0;
	while (ok)
	{
		ok=false;
		memset (v, 0, sizeof (v));
		for (i=1; i <= n; ++i) 
			if (b [i] == 0 && pairup (i)) ok=true;
	}
	for (i=1; i <= n; ++i)
		if (a [i]) ++r;
	return r;
}

void calculeaza (int k)
{
	vector <int> :: iterator i;
	for (i=g [k].begin (); i != g [k].end (); ++i)
		if (s [*i+n] == false)
		{
			s [*i+n]=true;
			s [a [*i]]=false;
			calculeaza (a [*i]);
		}
}

void suport ()
{
	int i;
	for (i=1; i <= n; ++i)
		if (b [i]) s [i]=true;
	for (i=1; i <= n; ++i)
		if (s [i] == false) calculeaza (i);
}

void print ()
{
	int i;
	for (i=1; i <= n; ++i)
	{
		if (s [i] == true && s [i+n] == true) printf ("0\n");
		if (s [i] == false && s [i+n] == true) printf ("1\n");
		if (s [i] == true && s [i+n] == false) printf ("2\n");
		if (s [i] == false && s [i+n] == false) printf ("3\n");
	}
}

int main ()
{
	freopen ("felinare.in", "r", stdin);
	freopen ("felinare.out", "w", stdout);
	int i, x, y;
	scanf ("%d%d", &n, &m);
	for (i=1; i <= m; ++i)
	{
		scanf ("%d%d", &x, &y);
		g [x].push_back (y);
	}
	printf ("%d\n", 2*n-cuplaj ());
	suport ();
	print ();
	return 0;
}