Cod sursa(job #3225797)

Utilizator alexdumitruAlexandru Dumitru alexdumitru Data 18 aprilie 2024 21:03:12
Problema Componente biconexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1e5;

int n, m;
stack<int> st;
int tin[NMAX + 1], low[NMAX + 1];
int tmr;
vector<int> g[NMAX + 1];
bool vis[NMAX + 1];

vector<vector<int>> components;

void dfs(int node, int dad = -1) {
    tin[node] = low[node] = ++tmr;
    st.push(node);
    vis[node] = 1;
    for (auto it : g[node]) {
        if (it == dad) continue;
        if (vis[it]) {
            low[node] = min(low[node], tin[it]);
        } else {
            dfs(it, node);
            low[node] = min(low[node], low[it]);
            if (low[it] >= tin[node]) {
                vector<int> comp;
                while (!st.empty() && st.top() != it) {
                    comp.push_back(st.top());
                    st.pop();
                }
                comp.push_back(it); st.pop();
                comp.push_back(node);
                components.push_back(comp);
            }
        }
    }
}

void solve() {
    fin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int u, v;
        fin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    dfs(1);

    fout << components.size() << '\n';

    for (auto &it : components) {
        for (int x : it)
            fout << x << ' ';
        fout << '\n';
    }
}

signed main() {
    solve();
    return 0;
}