Cod sursa(job #134302)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 11 februarie 2008 11:23:04
Problema Pioni Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#include <stdlib.h>

#define fin  "pioni.in"
#define fout "pioni.out"

const int Nmax = 20111;
const int Kmax = 30111;

int T,N,M,K,*g[Nmax];
int grade[Nmax];
int stare[Nmax];	//1 win , 2 lose

inline void df(int x)
{
	if ( stare[ x ] )
		return;

	int i;

	for ( i = 1; i <= grade[ x ]; ++i )
	{
		df(g[x][i]);
		if ( stare[ g[x][i] ] == 2 )
		{
			stare[ x ] = 1;
			return ;
		}
	}

	stare[ x ] = 2;
}

void readdata_solve()
{
	int i,j,x,y,castig;
	int tmp;
	int query[Kmax];

	freopen(fin,"r",stdin);
	freopen(fout,"w",stdout);

	scanf("%i%i%i",&T,&N,&M);

//citire grade
	for ( i = 1; i <= M; ++i )
	{
		scanf("%i%i",&x,&y);
		grade[x]++;
	}

	fclose(stdin);

//aloca mem
	for ( i = 1; i <= N; ++i )
	{
		g[i] = (int *) malloc( sizeof(int) * (grade[i] + 1) );
		grade[i] = 0;
	}

	freopen(fin,"r",stdin);

//citire date efectiv
	scanf("%i%i%i",&T,&N,&M);
	for ( i = 1; i <= M; ++i )
	{
		scanf("%i%i",&x,&y);
		g[x][ ++grade[x] ] = y;
	}

//calculare stare castig
	for ( i = 1; i <= N; ++i )
		df(i);

	while ( T -- )
	{
		scanf("%i",&K);

		castig = 2;

		tmp = 0;

		for ( i = 1; i <= K; ++i )
		{
			scanf("%i",&query[i]);
			if ( stare[ query[i] ] == 1 )
				++tmp;
		}

		if ( tmp > 0 )
		{
			printf("Nargy\n");

			printf("%i",tmp);

			for ( i = 1; i <= K; ++i )
				if ( stare[ query[i] ] == 1 )
				{
					x = query[i];
					for ( j = 1; j <= grade[x]; ++j )
						if ( stare[ g[x][j] ] == 2 )
						{
							printf(" %i %i",x,g[x][j]);
							break;
						}
				}

			printf("\n");
		}
		else
			printf("Fumeanu\n");
	}
}

int main()
{
	readdata_solve();
	return 0;
}