Cod sursa(job #2926483)

Utilizator gizzehhhAsavoaei Bianca Gabriela gizzehhh Data 17 octombrie 2022 20:39:13
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <iostream>
#include <bits/stdc++.h>
#define N 100005
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");

/// Vom folosi algoritmul lui Tarjan

vector < vector <int> > la(N), sol(N); /// matricea de adiacenta
vector <int> lowLink(N), disc(N), stkItem(N); /// lowLink[i] = x --> x e cel mai mic nod la care ajunge nodul i prin DFS
stack <int> stk; /// adaugam nodurile valide pe masura ce parcugem cu DFS, nodurile sunt eliminate de fiecare data cand s a gasit
                 /// o SCC
int n, m, x, y, i, j, cnt, g;



void Citire(){

    fin >> n >> m;
    for(i=1; i<=n; i++)
    {
        fin >> x >> y;
        la[x].push_back(y);
    }
}

void findComponent(int node){

    disc[node] = lowLink[node] = ++g;
    stk.push(node);
    stkItem[node] = 1;

    for( i = 0; i<la[node].size(); i++)
    {
        x = la[node][i];
        if(disc[x] == -1){
            findComponent(x);
              lowLink[node]= min(lowLink[node], lowLink[x]);
            }
        else if(stkItem[node])
            lowLink[node] = min(lowLink[node], disc[x]);

    }

    int poppedItem = 0;
    if(lowLink[node] == disc[node]){
        while(stk.top() != node){
            poppedItem = stk.top();
            stkItem[poppedItem] = 0;
            lowLink[poppedItem] = disc[node];
            stk.pop();

        }
        poppedItem = stk.top();
        stkItem[poppedItem] = 0;
        lowLink[poppedItem] = disc[node];
        stk.pop();

        cnt++;
    }


}

void WriteSol(){

    for(i=1; i<=n; i++)
        sol[lowLink[i]].push_back(i);

    fout << cnt <<"\n";
    for(i=1; i<=n; i++)
        if(sol[i].size()!=0)
    {
        for( j=0;  j<sol[i].size(); j++)
            fout << sol[i][j] <<" ";
        fout <<"\n";
    }
}
int main()
{
    Citire();
    for(i=1; i<=n; i++)
        disc[i] = lowLink[i] = -1;
    for(i=1; i<=n; i++)
        if(disc[i] == -1)
              findComponent(i);

    WriteSol();
    return 0;
}