Cod sursa(job #864858)

Utilizator veleanduAlex Velea veleandu Data 25 ianuarie 2013 20:07:47
Problema Felinare Scor 38
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cassert>
#include <cstdio>       

#include <vector>

using namespace std;

	#define max_n 10000
	#define pb push_back 

int Other[ 2*max_n ];
int RDR[ max_n ], RST[ max_n ];
bool Viz[ max_n ];
int n;

vector<int> Vertex[ 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 ( RST[ nod ] )
		return ;
	RST[ nod ] = 1;
	for ( int i=0; i< Vertex[ nod ].size(); ++i ){
		RDR[ Vertex[ nod ][ i ] ] = 0;
		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 );
	}

    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<=n; ++i )
			Viz[ i ] = false ;
	} while ( ok );

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