Cod sursa(job #2928819)

Utilizator iulitaalpetriIulita Alpetri iulitaalpetri Data 23 octombrie 2022 22:25:51
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <stack>

using namespace std;
//Pentru a afla nr de componente tare conexe(pt oricare doua noduri i si j, exista nod de la i la j si de la j la i), voi folosi algoritmul lui kosaraju.
int N,M, x, y;
stack<int> stiva;
vector<vector<int>> lista_adiacenta;
vector<vector<int>> lista_transpus;
vector<bool> vizitat_1;
vector<bool> vizitat_2;
int nr;
vector<vector<int>> ctc;

void dfs(int nod){
    vizitat_1[nod]= true;
    for(auto i: lista_adiacenta[nod]){
        if(!vizitat_1[i]) dfs(i);
    }

    stiva.push(nod);
}

void dfs_transpus(int nod){
    ctc[nr].push_back(nod);
    vizitat_2[nod]= true;
    for(auto i: lista_transpus[nod]){
        if(!vizitat_2[i]) dfs_transpus(i);
    }
}


int main(){
    ifstream f("ctc.in");
    ofstream g("ctc.out");
    f>>N>>M;

    lista_adiacenta.resize(N+1);
    lista_transpus.resize(N+1);
    vizitat_1.resize(N+1, false);
    vizitat_2.resize(N+1, false);
    ctc.resize(N+1);

//formam lista de adiacenta
    for(int i=1; i<=M;i++){
        f>>x>>y;
        lista_adiacenta[x].push_back(y);
        lista_transpus[y].push_back(x);
    }
    f.close();
    dfs(1);
    while(!stiva.empty()){
        int a= stiva.top();
        stiva.pop();
        if(!vizitat_2[a]){nr++;
            dfs_transpus(a);}
    }

    g<<nr<<endl;

    for(int i=1; i<=nr; i++){
        for(int j=0; j< ctc[i].size(); j++) g<<ctc[i][j]<<" ";
        g<<endl;
    }
    return 0;
}