Cod sursa(job #941508)

Utilizator toranagahVlad Badelita toranagah Data 18 aprilie 2013 22:45:04
Problema Pioni Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

ifstream fin("pioni.in");
ofstream fout("pioni.out");

const int MAX_N = 20100;

int T, N, M;
vector<int> graph[MAX_N];
int move[MAX_N];
bool visited[MAX_N];
bool winning_position[MAX_N];

#define FOR_EACH(it,v) for(typeof((v).begin()) it = (v).begin(); it != (v).end(); ++it)
void dfs(int node);

int main() {
  fin >> T >> N >> M;

  for (int i = 1, a, b; i <= M; ++i) {
    fin >> a >> b;
    graph[a].push_back(b);
  }

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

  for (int i = 1, nr; i <= T; ++i) {
    vector<int> first_move;
    fin >> nr;
    for (int j = 1, node; j <= nr; ++j) {
      fin >> node;
      if (winning_position[node]) {
        first_move.push_back(node);
      }
    }

    if (first_move.empty()) {
      fout << "Fumeanu\n";
    } else {
      fout << "Nargy\n";
      fout << first_move.size() << ' ';
      FOR_EACH(j, first_move) {
        fout << *j << ' ' << move[*j] << ' ';
      }
      fout << '\n';
    }
  }

  return 0;
}

void dfs(int node) {
  visited[node] = true;

  FOR_EACH (adjacent, graph[node]) {
    if (!visited[*adjacent]) {
      dfs(*adjacent);
    }

    if (!winning_position[*adjacent]) {
      winning_position[node] = true;
      move[node] = *adjacent;
    }
  }
}