Cod sursa(job #320021)

Utilizator CezarMocanCezar Mocan CezarMocan Data 3 iunie 2009 10:31:36
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define maxn 8192

using namespace std;

int n, m, i, j, a,b, sol;
int cup_st[maxn], cup_dr[maxn], viz[maxn], ok;
vector <int> v[maxn];
int ss[maxn], sd[maxn];

void cupleaza(int nod, int pt) {
 	int i, j, fiu;
	if (pt == 1) {
		if (viz[nod])
			return;
		viz[nod] = 1;
    	for (i = 0; i < v[nod].size(); i++) {
         	fiu = v[nod][i];
			cupleaza(fiu, 0);
			if (ok) {
             	cup_st[nod] = fiu;
				cup_dr[fiu] = nod;
				return;
			}
		}
	}
	else {
     	if (cup_dr[nod]) 
         	cupleaza(cup_dr[nod], 1);
		else {
         	ok = 1;
			return;
		}
	}
}

void df(int nod) {
	int i, fiu;
   	if (viz[nod])
		return;
	viz[nod] = 1;
			
	for (i = 0; i < v[nod].size(); i++) {
       	fiu = v[nod][i];
		if (!sd[fiu]) {
           	sd[fiu] = 1;
			ss[cup_dr[fiu]] = 0;
			df(cup_dr[fiu]);
		}
	}
}

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

	scanf("%d%d", &n, &m);
	for (i = 1; i <= m; i++) {
    	scanf("%d%d", &a, &b);
		v[a].push_back(b);
	}

	for (i = 1; i <= n; i++)
		if (!cup_st[i]) {
         	memset(viz, 0, sizeof(viz));
			ok = 0;
			cupleaza(i, 1);
			sol += ok;
		}

    for (i = 1; i <= n; i++)
		if (cup_st[i])
			ss[i] = 1;
				
	memset(viz, 0, sizeof(viz));
	for (i = 1; i <= n; i++)
		if (!cup_st[i])
			df(i);

	printf("%d\n", 2 * n - sol);

	for (i = 1; i <= n; i++) {
//		printf("%d %d\n", ss[i], sd[i]);
		if (ss[i] == 1 && sd[i] == 1)
			printf("0\n");
		if (ss[i] == 0 && sd[i] == 1)
			printf("1\n");
		if (ss[i] == 1 && sd[i] == 0)
			printf("2\n");
		if (ss[i] + sd[i] == 0)
			printf("3\n");
	}

	return 0;
}