Cod sursa(job #2928561)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 23 octombrie 2022 13:05:26
Problema Componente tare conexe Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <fstream>
#include <iostream>
#include <vector>

#define MAXN 100000

using namespace std;

int x;
int marked[MAXN], visitMarked[MAXN];

vector<vector<int>> v, u, r;
vector<int> visitOrder;

static inline bool isTaken(int x) {
  if (marked[x] % 2 != 0 || marked[x] == 0)
    return false;
  return true;
}

void visitflood(int id) {
  if (visitMarked[id] == 0) {
    visitMarked[id] = 1;

    int i;
    for (i = 0; i < v[id].size(); i++) {
      visitflood(v[i][i]);
    }

    visitOrder.push_back(id);
  }
}

void floodfill(int id) {
  if (marked[id] != x + 1 && !isTaken(id)) {
    marked[id] = x + 1;

    int i;
    for (i = 0; i < v[id].size(); i++) {
      floodfill(v[id][i]);
    }
  }
}
void reverseflood(int id) {
  if (marked[id] == x + 1) {
    marked[id] = x + 2;

    int i;
    for (i = 0; i < u[id].size(); i++) {
      reverseflood(u[id][i]);
    }
  }
}

int main() {
  int n, m, i, a, b, j, nr;

  ifstream fin("ctc.in");
  fin >> n >> m;
  v.resize(n);
  u.resize(n);
  // visitOrder.resize(n);

  for (i = 0; i < m; i++) {
    fin >> a >> b;
    a--;
    b--;

    v[a].push_back(b);
    u[b].push_back(a);
  }
  fin.close();

  //  for (i = 0; i < v.size(); i++) {
  //    cout << i + 1 << ": ";
  //    for (j = 0; j < v[i].size(); j++)
  //      cout << v[i][j] + 1 << " ";

  //    cout << endl;
  //  }

  for (i = 0; i < n; i++) {
    if (visitMarked[i] == 0)
      visitflood(i);
  }

  x = 0;
  for (i = 0; i < n; i++) {
    floodfill(visitOrder[i]);
    reverseflood(visitOrder[i]);
    x += 2;
  }
  x++;

  nr = 0;
  r.resize(x);
  for (i = 0; i < n; i++) {
    // printf("%d: %d\n", i, marked[i]);
    if (r[marked[i]].size() == 0)
      nr++;
    r[marked[i]].push_back(i);
  }

  ofstream fout("ctc.out");
  fout << nr << endl;
  for (i = 0; i < x; i++) {
    if (r[i].size() != 0) {
      for (j = 0; j < r[i].size(); j++) {
        fout << r[i][j] + 1 << " ";
      }
      fout << endl;
    }
  }
  fout << endl;
  fout.close();
  return 0;
}