Cod sursa(job #134189)

Utilizator webspiderDumitru Bogdan webspider Data 10 februarie 2008 20:38:46
Problema Pioni Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;

const int maxN = 50001;

int nrP[ maxN ];
int stare[ maxN ];
vector<int> vec[ maxN ];
int T,N,M,K;
int nM, nodM;

void dfs( int nodC ) {
	stare[ nodC ] = 1;
	for ( int i = 0; i < vec[ nodC ].size(); i++ ) {
		if ( stare[ vec[nodC][i] ] ) 
			dfs( vec[nodC][i] );
		if ( stare[ vec[nodC][i] ] == 1 )
			stare[ nodC ] = 2;
	}
}


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

	scanf("%d %d %d\n", &T, &N, &M );

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

	for ( int i = 1; i <= N; i++ )
		if ( !stare[ i ] ) dfs( i );

	while ( T ) {
		T--;

		memset( nrP, 0, sizeof ( nrP ) );
		scanf("%d ", &K );
		for ( int i = 1; i <= K; i++ ) {
			scanf("%d ", &a );
			nrP[ a ]++;
		}
		vec[0].clear();
		for ( int i = 1; i <= N; i++ )
			if ( stare[ i ] == 2 && nrP[ i ] ) 
				vec[ 0 ].push_back( i );
		if ( vec[0].empty() ) {
			printf("Fumeanu\n");
		}
		else {
			printf("Nargy\n");
			nM = 0;
			for ( int i = 0; i < vec[0].size(); i++ ) 
				nM += nrP[ vec[0][i] ];
			printf("%d", nM );
			for ( int i = 0; i < vec[0].size(); i++ ) {
				for ( int j = 0; j < vec[ vec[0][i] ].size(); j++ ) {
					if ( stare[ vec[ vec[0][i] ][ j ] ] == 1 )
						nodM = vec[ vec[0][i] ][ j ];
				}
				while ( nrP[ vec[0][i] ] ) {
					nrP[ vec[0][i] ]--;
					printf(" %d %d", vec[0][i], nodM );
				}
			}
			printf("\n");
			
		}
		

	}

	return 0;
}