Cod sursa(job #1164887)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 2 aprilie 2014 12:46:55
Problema Felinare Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define nmax 9000
#define maxBool(a,b) (a)?(true):(b)
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;
			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) changed = maxBool(connect(i),changed);
		}
		memset(viz,false,nmax);
	}
	for (int i=1;i<=n;i++) {
		if (!left[i]) back(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;
}