Cod sursa(job #1164974)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 2 aprilie 2014 13:22:07
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define nmax 9000
using namespace std;

vector <int> g[nmax];
int c1[nmax],c2[nmax];
bool left[nmax],right[nmax];
bool viz[nmax];
int n,m;
int nr;

bool connect(int x) {
	if (viz[x]) return false;
	viz[x] = true;
	for (vector <int> :: iterator it = g[x].begin();it != g[x].end();it++) {
		if (c2[*it] == 0) {
			c2[*it] = x;
			c1[x] = *it;
			left[x] = true;
			return true;
		}
	}
	for (vector <int> :: iterator it = g[x].begin();it != g[x].end();it++) {
		if (connect(c2[*it])) {
			c2[*it] = x;
			c1[x] = *it;
			left[x] = true;
			return true;
		}
	}
	return false;
}

int back(int x) {
	for (vector <int> :: iterator it = g[x].begin();it != g[x].end();it++) {
		if (!right[*it]) {
			right[*it] = true;
			left[c2[*it]] = false;
			back(c2[*it]);
		}
	}
}

int main() {
	freopen("felinare.in","r",stdin);
	freopen("felinare.out","w",stdout);
	scanf("%d %d",&n,&m);
	nr = 2*n;
	for (int i=1;i<=m;i++) {
		int a,b;
		scanf("%d %d",&a,&b);
		g[a].push_back(b);
	}
	for (bool changed = true;changed;) {
		changed = false;
		for (int i=1;i<=n;i++) {
			if (c1[i] == 0 && connect(i)) changed = true;
		}
		for (int i=0;i < nmax;i++) viz[i] = false;
	}
	for (int i=1;i<=n;i++) {
		if (!left[i]) back(i);
	}
	for (int i=1;i<=n;i++) {
		if (left[i]) nr--;
		if (right[i]) nr--;
	}
	printf("%d\n",nr);
	for (int i=1;i<=n;i++) {
		int r = 3;
		if (left[i]) r -= 1;
		if (right[i]) r -= 2;
		printf("%d\n",r);
	}
	return 0;
}