Cod sursa(job #2928592)

Utilizator woodyinhoStoica Elias-Valeriu woodyinho Data 23 octombrie 2022 14:09:42
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <stack>

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

std::vector<int> viz(100001, 0);
std::vector<std::vector<int>> graf(100001);
std::stack<int> coada;
std::vector<std::vector<int>> graf_transpus(100001);
std::vector<std::vector<int>> solutie(100001);
int nrctc;

void dfs(int nod)
{
    viz[nod] = 1;
    for(auto &i:graf[nod]){
        if(!viz[i]){
            dfs(i);
        }
    }
    coada.push(nod);
}

void dfsutil(int nod){
    viz[nod] = 1;
    solutie[nrctc].push_back(nod);
    for(auto &i:graf_transpus[nod]){
        if(viz[i] == 0)
        {
            dfsutil(i);
        }
    }
}

int main() {

    int n, m;
    f>>n>>m;
    for(int i = 1; i<=m; i++){
        int x,y;
        f>>x>>y;
        graf[x].push_back(y);
    }

    for(int i = 1; i<=n; i++)
        if(!viz[i]) {
            dfs(i);
        }

//    while(!coada.empty()){
//        std::cout<<coada.top()<<" ";
//        coada.pop();
//    }

    for(int i = 1; i<=n; i++){
        for(auto &vecini:graf[i])
        {
            graf_transpus[vecini].push_back(i);
        }
    }

    for(int i = 1; i<=n; i++) {
        viz[i] = 0;//Pregatim vectorul viz pt al doilea DFS pe graful transpus
    }

    while(!coada.empty()){
        int v = coada.top();
        coada.pop();
        if(viz[v] == 0){
            dfsutil(v);
            nrctc++;
        }
    }
    g<<nrctc<<"\n";
    for(auto &comp_conexa:solutie){
        for(auto &nod:comp_conexa){
            g<<nod<<" ";
        }
        g<<"\n";
    }

//    std::cout<<"\n";
//    for(int i = 1; i<=n; i++)
//    {
//        std::cout<<i<<": ";
//        for(auto &j:graf_transpus[i])
//            std::cout<<j<<", ";
//        std::cout<<"\n";
//    }
    return 0;
}