Pagini recente » Cod sursa (job #283484) | Cod sursa (job #1019481) | Cod sursa (job #2637189) | Cod sursa (job #2775432) | Cod sursa (job #133882)
Cod sursa(job #133882)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const char iname[] = "pioni.in";
const char oname[] = "pioni.out";
const int MAXN = 20005;
vector <int> G[MAXN], Num(MAXN), Cnt(MAXN), deg(MAXN, 0); int n;
void DF(int n)
{
if (Num[n] != -1)
return ;
if (deg[n] == 0) {
Num[n] = 0;
return ;
}
bool zero = false;
vector <int>::iterator i;
for (i = G[n].begin(); i != G[n].end(); ++ i)
{
DF(*i);
if (Num[*i] == 0)
zero = true;
}
Num[n] = zero ? 1 : 0;
}
int main(void)
{
FILE *fi, *fo;
int css, cnt;
fi = fopen(iname, "r");
fo = fopen(oname, "w");
fscanf(fi, "%d %d %d", &css, &n, &cnt);
for (; cnt > 0; -- cnt)
{
int x, y;
fscanf(fi, "%d %d", &x, &y);
G[x].push_back(y);
deg[x] ++;
}
for (; css > 0; -- css)
{
Cnt.assign(n + 1, 0);
for (fscanf(fi, "%d", &cnt); cnt > 0; -- cnt)
{
int nod;
fscanf(fi, "%d", &nod);
Cnt[nod] ++;
}
Num.assign(n + 1, -1);
for (int i = 1; i <= n; ++ i)
DF(i);
int moves = 0;
for (int i = 1; i <= n; ++ i) if (Cnt[i] && Num[i])
moves += Cnt[i];
if (moves)
{
fprintf(fo, "Nargy\n");
fprintf(fo, "%d", moves);
for (int i = 1; i <= n; ++ i) if (Cnt[i] && Num[i])
{
vector <int>::iterator j;
for (j = G[i].begin(); j != G[i].end(); ++ j)
if (Num[*j] == 0)
{
for (; Cnt[i] > 0; -- Cnt[i])
fprintf(fo, " %d %d", i, *j);
break ;
}
}
fprintf(fo, "\n");
} else
fprintf(fo, "Fumeanu\n");
}
fcloseall();
return 0;
}