Cod sursa(job #2928866)

Utilizator Stefan_MagureanuMagureanu Stefan Stefan_Magureanu Data 24 octombrie 2022 00:28:35
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>
#include <unordered_map>
#include <stack>

using namespace std;

ifstream fin("ctc.in");
ofstream fout("ctc.out");

int nr_ctc, index = 1;
stack<int> stiva;
unordered_map<int, vector<int>> ctc, adj_list;
vector<int> low_link;
vector<bool> on_stack;
vector<int> id;

void dfs(int node) {
    stiva.push(node);
    id[node] = index;
    low_link[node] = index;
    on_stack[node] = true;
    index++;
    for (auto neighbor: adj_list[node]) {
        if (!id[neighbor])
            dfs(neighbor);
        if (on_stack[neighbor])
            low_link[node] = min(low_link[node], low_link[neighbor]);
    }
    if (id[node] == low_link[node]) {
        while (!stiva.empty()) {
            int head = stiva.top();
            on_stack[head] = false;
            low_link[head] = node;
            ctc[nr_ctc].push_back(head);
            stiva.pop();
            if (head == node)
                break;
        }
        nr_ctc++;
    }
}

int main() {
    int v1, v2;
    int num_nodes, num_edges;
    fin >> num_nodes >> num_edges;
    low_link.resize(num_nodes + 1, 0);
    on_stack.resize(num_nodes + 1, false);
    id.resize(num_nodes + 1, 0);
    for (int i = 0; i < num_edges; i++) {
        fin >> v1 >> v2;
        adj_list[v1].push_back(v2);
    }
    for (int i = 1; i <= num_nodes; i++) {
        if (!id[i])
            dfs(i);
    }
    for (auto &it: ctc) {
        for (auto &componenta: it.second) {
            fout << componenta << " ";
        }
        fout << "\n";
    }
    return 0;
}