Cod sursa(job #2677358)

Utilizator Giulian617Buzatu Giulian Giulian617 Data 26 noiembrie 2020 12:25:19
Problema Componente biconexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("biconex.in");
ofstream g("biconex.out");
const int NMAX=100005;
int n,m,x,y;
vector<int>v[NMAX];
vector<int>disc,low;
vector<vector<int>>c;
stack<pair<int,int>>s;
void articulation_point(int x,int y)
{
    int tx,ty;
    vector<int>connected;
    //toti copiii lui  din stiva fac parte din componenta coenxa
    while(tx!=x || ty!=y)
    {
        tx=s.top().first;
        ty=s.top().second;
        s.pop();
        connected.push_back(tx);
        connected.push_back(ty);
    }
    c.push_back(connected);
}
void dfs(int x,int parent,int k)
{
    disc[x]=low[x]=k;
    for(int i=0; i<v[x].size(); i++)
    {
        if(v[x][i]!=parent && disc[v[x][i]]==-1)
        {
            //pun muchia pe care ma duc in stiva
            s.push({x,v[x][i]});
            dfs(v[x][i],x,k+1);
            //dfs pe vecinul ales
            //daca copiii lui x au putut sa ajunga intr-un nod doar printr-o muchie de intoarcere
            //deci si x poate
            low[x]=min(low[x],low[v[x][i]]);
            if(low[v[x][i]]>=disc[x])//conditia ca x sa fie punct de articulatie
                articulation_point(x,v[x][i]);
        }
        else if(disc[v[x][i]]!=-1) //nodul e deja vizitat,deci avem o muchie de intoarcere
            low[x]=min(low[x],disc[v[x][i]]);
    }
}
int main()
{
    f>>n>>m;
    for(int i=1; i<=m; i++)
    {
        f>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    disc=vector<int>(n+5,-1);//disc[x] reprezinta al catelea nod din parcurgere este x
    low=vector<int>(n+5);//low[x] cel mai de sus stramos la care se poate ajunge direct printr-o muchie de intoarcere
    dfs(1,0,0);
    g<<c.size()<<"\n";
    for(int i=0; i<c.size(); i++)
    {
        sort(c[i].begin(),c[i].end());
        c[i].erase(unique(c[i].begin(),c[i].end()),c[i].end());
        for(int j=0; j<c[i].size(); j++)
            g<<c[i][j]<<" ";
        g<<"\n";
    }
    return 0;
}