Cod sursa(job #2932586)

Utilizator readyitzooDilirici Mihai readyitzoo Data 3 noiembrie 2022 10:50:06
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.29 kb
#include <bits/stdc++.h>

using namespace std;

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

vector<vector<int>> graph; // lista de adiacenta pt graf
vector<vector<int>> graph_t; // lista de adiacenta pt graful transpus
int index=1; //numarul de comp tari conexe
stack <int> S; // stiva in care vom pune rezolvarea
queue <int> Q; // coada care ne va ajuta sa afisam in ordinea corecta rezultatul (intai nr si apoi componentele)
vector<int> visited;

// Implementam algoritmul lui Kosaraju cu doua dfs-uri (primul pe lista de adiacenta grafului,
// iar a doua pe cea a grafului transpus

void DFS_t(vector<vector<int>> graph_t, int n, int x, int index){
    visited[x] = index;
    for(int i = 0; i < graph_t[x].size(); i ++){
        if(visited[graph_t[x][i]] == 0){
            DFS_t(graph_t, n, graph_t[x][i], index);
        }
    }
    S.push(x);
}

void DFS(vector<vector<int>> graph, int n, int x){
    visited[x] = index;
    for(int i = 0; i < graph[x].size(); i ++){
        if(visited[graph[x][i]] == 0){
            DFS(graph, n, graph[x][i]);
        }
    }
    S.push(x);
}



int main() {
    int n, m;

    f >> n >> m;
    graph.resize(n+1);
    graph_t.resize(n+1);
    visited.resize(n+1);
    for(int i = 0; i < m; i ++){
        int x, y;
        f >> x >> y;
        graph[x].push_back(y);
        graph_t[y].push_back(x);
    }

    for(int i = 1; i <= n;i ++){
        if(visited[i] == 0){
            DFS(graph, n, i);
        }
    }

    for(int i = 1; i <= n; i ++){ // reinitializam vectorul de vizitat ca sa putem aplica al 2-lea dfs
        visited[i] = 0;
    }

    while(!S.empty()){
        int x=S.top();
        S.pop();
        if(visited[x] == 0){
            DFS_t(graph_t, n, x, index);
            for(int i = 1; i <= n; i++){
                if(visited[i] == index){
                    Q.push(i); // bagam raspunsul intr-o coada
                }
            }
            Q.push(-1); // pentru endl;
            index += 1;
        }
    }
    g << index - 1 << endl; // afisam nr de comp tari conexe
    while(!Q.empty()){ // afisam din coada creata anterior componentele conexe
        int x=Q.front();
        Q.pop();
        if (x != -1)
            g << x << " "; // afisam in fisierul ctc.out
        else
            g << endl;
    }

    return 0;
}

// Complexitate: O(n + m) = de la dfs