Cod sursa(job #138012)

Utilizator alextheroTandrau Alexandru alexthero Data 17 februarie 2008 19:38:38
Problema Pioni Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#include <string.h>
#include <vector>

#define nmax 20005
#define sgmax 1000
#define kmax 30005

using namespace std;

int k, t, n, m, n1, n2, sg[nmax], rez, aux;
int a[kmax];
char v[nmax];
vector <int> e[nmax];

void dfs(int x)
{
	v[x] = 1;
	sg[x] = 0;
	for(int i = 0; i < (int)e[x].size(); i++)
		if(!v[e[x][i]]) dfs(e[x][i]);

	sg[x] = 0;
	for(int i = 0; i < (int)e[x].size(); i++)
		if(sg[e[x][i]] == 0) sg[x] = 1;
}

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

	scanf("%d%d%d", &t, &n, &m);
	for(int i = 1; i <= m; i++) 
	{
		scanf("%d%d", &n1, &n2);
		e[n1].push_back(n2);
	}

	memset(v, 0, sizeof(v));
	for(int i = 1; i <= n; i++)
		if(!v[i]) dfs(i);

	for(int i = 1; i <= t; i++)
	{
		scanf("%d", &k);
		rez = 0;
		int cate = 0;
		for(int j = 1; j <= k; j++)
		{
			scanf("%d", &a[j]);
			if(sg[a[j]]) cate++;
		}
		if(cate == 0) printf("Fumeanu\n");
		else
		{
			printf("Nargy\n");
			printf("%d ", cate);
			for(int j = 1; j <= k; j++)
				if(sg[a[j]] == 1)
				{
					printf("%d ", a[j]);
					int where = 0;
					for(int l = 0; l < (int)e[a[j]].size(); l++)
						if(sg[e[a[j]][l]] == 0) 
						{
							where = e[a[j]][l];
							break;
						}
					printf("%d ", where);
				}
			printf("\n");
		}
	}

	return 0;
}