Cod sursa(job #1438978)

Utilizator eneandradaEne Oana-Andrada eneandrada Data 21 mai 2015 10:53:44
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <vector>

#define MAX_N 100006

using namespace std;

ifstream f("ctc.in");
ofstream g("ctc.out");

vector <int> G[MAX_N], C[MAX_N];
int index_global, top, comp_conexe;
int Stack[MAX_N], index[MAX_N], lowlink[MAX_N];
bool onStack[MAX_N] = {false};

void strongconnect(int v)
{
    index[v] = index_global;
    lowlink[v] = index_global;
    index_global ++;
    Stack[++top] = v;
    onStack[v] = true;

    for(int i = 0; i < G[v].size(); i++)
    {
        if(index[G[v][i]] == -1)
        {
            strongconnect(G[v][i]);
            lowlink[v] = min(lowlink[v], lowlink[G[v][i]]);
        }
        else
            if(onStack[G[v][i]] == true)
            {
                lowlink[v] = min(lowlink[v], lowlink[G[v][i]]);
            }
    }

    if(lowlink[v] == index[v])
    {
        comp_conexe++;
        int w;
        do
        {
            w = Stack[top];
            onStack[w] = false;
            top--;
            C[comp_conexe].push_back(w);
        }while(w != v);
    }
}

int main()
{
    int N, M, i, x, y;
    for(i = 0; i < MAX_N; i++)
    {
        index[i] = -1;
        lowlink[i] = -1;
    }
    f >> N >> M;
    for(i = 1; i <= M; i++)
    {
        f >> x >> y;
        G[x].push_back(y);
    }
    for(i = 1; i <= N; i++)
        if(index[i] == -1)
            strongconnect(i);
    g<<comp_conexe<<endl;
    for(i = 1; i <= comp_conexe; i++)
    {
        for(int j = 0; j < C[i].size(); j++)
            g<<C[i][j]<<" ";
        g<<endl;
    }
    return 0;
}