Cod sursa(job #175621)

Utilizator anoukAnca Dumitrache anouk Data 10 aprilie 2008 10:49:15
Problema Pioni Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <cstdio>
#include <cstring>
#define DIM 20002
#define INF 100005
using namespace std;

typedef struct Nod {
	int vf;
	Nod* next;
} NOD, *PNOD;
PNOD L[DIM];
int N, M, T, K, nr[DIM], S[3 * DIM], nxt[DIM];

void Add(int x, int y)
{
	PNOD p = new NOD;
	p->vf = y;
	p->next = L[x];
	L[x] = p;
}

int DF(int nod)
{
	if (nr[nod] != -1) return nr[nod];
	for (PNOD p = L[nod]; p; p = p->next)
	{
		int x = DF(p->vf);
		if (!x)
		{
			nr[nod] = 1;
			nxt[nod] = p->vf;
			return 1;
		}
	}
	nr[nod] = 0;
	return 0;
}

int main()
{
	FILE *fin = fopen("pioni.in", "r");
	FILE *fout = fopen("pioni.out", "w");
	
	fscanf(fin, "%d%d%d", &T, &N, &M);
	int x, y;
	for (int i = 1; i <= M; i++)
	{
		fscanf(fin, "%d%d", &x, &y);
		Add(x, y);
	}
	memset(nr, -1, sizeof(nr));
	for (int i = 1; i <= T; i++)
	{
		int win = 0;
		fscanf(fin, "%d", &K);
		for (int j = 1; j <= K; j++)
		{
			fscanf(fin, "%d", S + j);
			win += DF(S[j]);
		}
		if (win)
		{
			fprintf(fout, "Nargy\n%d ", win);
			for (int j = 1; j <= K; j++)
				if (nr[S[j]]) fprintf(fout, "%d %d ", S[j], nxt[S[j]]);
			fprintf(fout, "\n");

		}
		else
			fprintf(fout, "Fumeanu\n");
	}

	fclose(fin);
	fclose(fout);
	return 0;
}