Cod sursa(job #3317113)

Utilizator petru-robuRobu Petru petru-robu Data 22 octombrie 2025 11:12:36
Problema Componente biconexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, m;
vector<vector<int>> adj_list;
vector<int> visited, min_level, level;
stack<pair<int, int>> s;

vector<vector<int>> comp;

void getComponent(int x, int y)
{
    if(s.empty())
        return;

    vector<int> nodes;

    auto [topx, topy] = s.top();
    s.pop();
    nodes.push_back(topx);
    nodes.push_back(topy);

    while(!s.empty() && (topx != x || topy != y))
    {
        topx = s.top().first;
        topy = s.top().second;
        s.pop();
        nodes.push_back(topx);
        nodes.push_back(topy);
    }

    comp.push_back(nodes);
}

void read()
{
    fin>>n>>m;

    adj_list.resize(n+1);visited.resize(n+1);min_level.resize(n+1);
    level.resize(n+1);

    for(int i=0; i<m; i++)
    {
        int x, y;
        fin>>x>>y;
        adj_list[x].push_back(y);
        adj_list[y].push_back(x);
    }
}

void dfs(int x)
{
    visited[x] = 1;
    min_level[x] = level[x];

    for(auto &next:adj_list[x])
    {
        if(!visited[next])
        {
            level[next] = level[x] + 1;

            s.push({x, next});

            dfs(next); 
            min_level[x] = min(min_level[x], min_level[next]);

            if(min_level[next] >= level[x]) // muchia {next, x} e critica
                getComponent(x, next);
        }
        else
            if(level[next] < level[x] - 1) // next nu e parinte al lui x
                min_level[x] = min(min_level[x], level[next]);
    }
}

void removeDuplicates(vector<int>& v)
{
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
}


int main()
{
    read();
    
    for(int i=1; i<=n; i++)
        if(!visited[i])
            dfs(i);

    for(int i=1; i<=n; i++)
    {
        cout<<i<<": "<<level[i]+1<<" "<<min_level[i]+1<<"\n";
    }

    fout<<comp.size()<<"\n";
    for(auto &c:comp)
    {
        removeDuplicates(c);
        for(auto &x:c)
            fout<<x<<' ';
        fout<<'\n';
    }

    return 0;
}