Cod sursa(job #2107488)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 17 ianuarie 2018 12:07:54
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
FILE *f = fopen("ctc.in","r");
FILE *g = fopen("ctc.out","w");
const int NMAX = 100000;
int N,M,Q;
int lowest[20][NMAX + 5];
int gr[NMAX + 5];
vector<int> G[NMAX + 5];
vector<int> DAG[NMAX + 5];
vector<int> T[NMAX + 5];
vector<vector<int> > CTC;
int low[NMAX + 5];
int id[NMAX + 5];
int st[NMAX + 5];
bool inst[NMAX + 5];
int len,lastid;
int comp[NMAX + 5];
int nrcomp;
int X[NMAX + 5];
int Y[NMAX + 5];
void ctc(int nod){
   low[nod] = id[nod] = ++lastid;
   st[++len] = nod;
   inst[nod] = 1;
   for(auto it:G[nod]){
      if(!id[it]){
         ctc(it);
      }
      if(inst[it]){
         low[nod] = min(low[nod],low[it]);
      }
   }
   if(low[nod] == id[nod]){
      vector<int> tmp;
      ++nrcomp;
      while(st[len] != nod){
         comp[st[len]] = nrcomp;
         inst[st[len]] = 0;
         tmp.push_back(st[len]);
         len--;
      }
      len--;
      comp[nod] = nrcomp;
      inst[nod] = 0;
      tmp.push_back(nod);
      CTC.push_back(tmp);
   }
}
int main() {
    fscanf(f,"%d %d",&N,&M);
    for(int i = 1;i <= M;i++){
       fscanf(f,"%d %d",&X[i],&Y[i]);
       G[X[i]].push_back(Y[i]);
    }
    ctc(1);
    fprintf(g,"%d\n",(int)CTC.size());
    for(auto it:CTC){
        for(auto it2:it){
            fprintf(g,"%d ",it2);
        }
        fputc('\n',g);
    }
    fclose(f);
    fclose(g);
    return 0;
}