Cod sursa(job #399104)

Utilizator katakunaCazacu Alexandru katakuna Data 19 februarie 2010 20:43:46
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <cstdio>
#include <vector>
using namespace std;

#define Nmax 8200

int n, m;
int viz[Nmax], L[Nmax], R[Nmax], Sl[Nmax], Sr[Nmax];
vector <int> G[Nmax];
void citire (), afisare ();

int cuplaj (int nod) {
	
	if (viz[nod]) return 0;
	viz[nod] = 1;
	
	int i;
	for (i = 0; i < (int) G[nod].size (); i++)
		if (!R[ G[nod][i] ]) {
			R[ G[nod][i] ] = nod;
			L[nod] = G[nod][i];
			return 1;
		}
	
	for (i = 0; i < (int) G[nod].size (); i++)
		if (R[ G[nod][i] ] && cuplaj ( R[G[nod][i]] )) {
			R[ G[nod][i] ] = nod;
			L[nod] = G[nod][i];
			return 1;
		}
	
	return 0;
}

void suport_minim (int nod) {
	
	int i;
	for (i = 0; i < (int)G[nod].size (); i++) {
		if (!Sr[ G[nod][i] ]) {
			Sr[ G[nod][i] ] = 1; Sl[ R[G[nod][i]] ] = 0;
			suport_minim ( R[G[nod][i]] );
		}
	}
}

int main () {

	freopen ("felinare.in", "r", stdin);
	freopen ("felinare.out", "w", stdout);

	citire ();
	
	int i;
	for (int ok = 1; ok;) {
		ok = 0; memset (viz, 0, sizeof (viz));
		
		for (i = 1; i <= n; i++)
			if (!L[i] && cuplaj (i)) ok = 1;
	}
	
	int C = 0;
	for (i = 1; i <= n; i++)
		if (L[i]) C++;
	
	printf ("%d\n", (n << 1) - C);
	
	for (i = 1; i <= n; i++)
		if (L[i]) Sl[i] = 1;
	
	for (i = 1; i <= n; i++)
		if (!L[i]) suport_minim (i);
	
	afisare ();
	
	return 0;
}

void citire () {
	
	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);
	}
}

void afisare () {
	
	for (int i = 1; i <= n; i++) {
		if (Sl[i] && Sr[i]) printf ("%d\n", 0);
		if (!Sl[i] && Sr[i]) printf ("%d\n", 1);
		if (Sl[i] && !Sr[i]) printf ("%d\n", 2);
		if (!Sl[i] && !Sr[i]) printf ("%d\n", 3);
	}
}