Cod sursa(job #1731953)

Utilizator TimoteiCopaciu Timotei Timotei Data 20 iulie 2016 14:44:20
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define nmax 100005
using namespace std;
int n, m, x, y, idx, ctc;
vector <int>  vecin[nmax], sol[nmax];
stack <int> s;
typedef struct {
   int index, lowlink;
   bool in_stack;
}node;
node v[nmax];
void read()
{
    ifstream fin("ctc.in");
    fin >> n >> m;
    for(int i = 1; i <= m; ++i){
        fin >> x >> y;
        vecin[x].push_back(y);
    }
}
void tarjan(int x)
{
  v[x].index = ++idx;
  v[x].lowlink = idx;
  s.push(x);
  v[x].in_stack = true;
  for(int i = 0; i < vecin[x].size(); ++i)
  if(v[vecin[x][i]].index == 0){
        tarjan(vecin[x][i]);
        v[x].lowlink = min(v[x].lowlink, v[vecin[x][i]].lowlink);
      }
   else if(v[vecin[x][i]].in_stack)
       v[x].lowlink = min(v[x].lowlink, v[vecin[x][i]].index);

   if(v[x].index == v[x].lowlink){
        ctc++;
    do{
     y = s.top();
     s.pop();
     v[y].in_stack = false;
     sol[ctc].push_back(y);
    } while(y != x);
   }
}

void write()
{
    ofstream fout("ctc.out");
    fout << ctc;
    for(int i = 1; i <= ctc; ++i){
        fout << '\n';
        for(int j = 0; j < sol[i].size(); ++j)
            fout << sol[i][j] << ' ';
    }
}
int main()
{
    read();
    for(int i = 1; i <= n; ++i)
    if(v[i].index == 0)
        tarjan(i);
    write();
    return 0;
}