Cod sursa(job #864881)

Utilizator veleanduAlex Velea veleandu Data 25 ianuarie 2013 20:33:35
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cassert>
#include <cstdio>       

#include <vector>

using namespace std;

	#define max_n 10000
	#define pb push_back 

int Other[ 2*max_n ];
int Rez[ 2*max_n ];
bool Viz[ 2*max_n ];
int n;

vector<int> Vertex[ 2*max_n ];

bool find_path ( int nod ){
	if ( Viz[ nod ] )
		return 0;
	Viz[ nod ] = 1;
	for ( int i=0; i< Vertex[ nod ].size(); ++i ){
		if ( !Other[ Vertex[ nod ][ i ] ] || find_path ( Other[ Vertex[ nod ][ i ] ] ) ){
			Other[ nod ] = Vertex[ nod ][ i ];
			Other[ Vertex[ nod ][ i ] ] = nod;
			return 1;
		}
	}
	return 0;
}

void df ( int nod ){
	if ( Viz[ nod ] == 1 )
		return ;
	Viz[ nod ] = 1;
	Rez[ nod ] = 1;
	for ( int i=0; i< Vertex[ nod ].size(); ++i ){
		Rez[ Vertex[ nod ][ i ] ] = 2;
		Viz[ Vertex[ nod ][ i ] ] = 1;
		df ( Other[ Vertex[ nod ][ i ] ] );
	}
	return ;
}

int main(){

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

	int m;
	int a,b;
	scanf ("%d %d", &n, &m );
	for ( ; m; --m ){
		scanf ("%d %d", &a, &b );
		Vertex[ a ]. pb ( n+b );
		Vertex[ n+b ]. pb ( a );
	}

    bool ok;
	int rez=0;
	do {
		ok = false;
		for ( int i=1; i<=n; ++i ){
			if ( !Other[ i ] ){
            	if ( find_path ( i ) ){
				   	ok=1; 
					rez ++;
				}
			}
		}
		for ( int i=1; i<=2*n; ++i )
			Viz[ i ] = false ;
	} while ( ok );

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

	for ( int i=1; i<=2*n; ++i ){
		if ( !Other[ i ] && !Viz[ i ] )
			df ( i );
	}
	for ( int i=1; i<=2*n; ++i ){
		if ( Viz[ i ] == 0 )
			df ( i );
	}
	for ( int i=1; i<=n; ++i ){
		int p=0;
		if ( Rez[ i ] == 1 )
			p++;
		if ( Rez[ i+n ] == 1 )
			p+=2;
		printf("%d\n",p);
	}
	return 0;
}