Cod sursa(job #2738976)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 6 aprilie 2021 17:19:23
Problema Componente biconexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.23 kb
#include <bits/stdc++.h>

using namespace std;

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

vector<int>v[100100],SOL[100100];
vector < pair < int , int > > sol;
stack < pair < int , int > > st;
int nr_comp,nr_rad,A[100100],fv[100100],viz[100100],ant[100100],h[100100],tata[100100];

void puncte_articulatie(int nod)
{
    viz[nod]=1;
    ant[nod]=h[nod];

    for(int i=0;i<v[nod].size();i++)
    {
        int vecin=v[nod][i];
        if(viz[vecin]==0)
        {
            if(nod==1)nr_rad++;

            h[vecin]=h[nod]+1;
            tata[vecin]=nod;
            puncte_articulatie(vecin);

            ant[nod]=min(ant[nod],ant[vecin]);
            if(ant[vecin]>=h[nod])fv[nod]=1;
        }
        else if(tata[nod]!=vecin && h[vecin]<ant[nod])ant[nod]=h[vecin];
    }
}

void muchii_critice(int nod)
{
    viz[nod]=1;
    ant[nod]=h[nod];

    for(int i=0;i<v[nod].size();i++)
    {
        int vecin=v[nod][i];
        if(viz[vecin]==0)
        {
            h[vecin]=h[nod]+1;
            tata[vecin]=nod;
            muchii_critice(vecin);

            ant[nod]=min(ant[nod],ant[vecin]);

            if(ant[vecin]>h[nod])
            {
                sol.push_back({nod,vecin});
            }
        }
        else if(tata[nod]!=vecin && h[vecin]<ant[nod])ant[nod]=h[vecin];
    }
}

void componente_biconexe(int nod)
{
    viz[nod]=1;
    ant[nod]=h[nod];

    for(int i=0;i<v[nod].size();i++)
    {
        int vecin=v[nod][i];
        if(viz[vecin]==0)
        {
            st.push({nod,vecin});
            h[vecin]=h[nod]+1;
            tata[vecin]=nod;
            componente_biconexe(vecin);

            ant[nod]=min(ant[nod],ant[vecin]);

            if(ant[vecin]>=h[nod])
            {
                nr_comp++;
                int m=0;
                while(!(st.top().first==nod && st.top().second==vecin))
                {
                    m++;A[m]=st.top().first;
                    m++;A[m]=st.top().second;
                    st.pop();
                }
                m++;A[m]=st.top().first;
                m++;A[m]=st.top().second;
                st.pop();

                sort(A+1,A+m+1);
                for(int j=1;j<=m;j++)
                    if(A[j]!=A[j-1])SOL[nr_comp].push_back(A[j]);
            }
        }
        else if(tata[nod]!=vecin && h[vecin]<ant[nod])ant[nod]=h[vecin];
    }
}

int c,m,n,j,x,y,i,ans;
int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }

    if(c==2)
    {
        puncte_articulatie(1);
        if(nr_rad>=2)fv[1]=1;
        else fv[1]=0;

        for(i=1;i<=n;i++)if(fv[i]==1)ans++;
        g<<ans<<'\n';
        for(i=1;i<=n;i++)
            if(fv[i]==1)g<<i<<" ";
    }
    else if(c==3)
    {
        muchii_critice(1);
        g<<sol.size()<<'\n';
        for(i=0;i<sol.size();i++)
            g<<sol[i].first<<" "<<sol[i].second<<'\n';
    }
    else
    {
        componente_biconexe(1);
        g<<nr_comp<<'\n';
        for(i=1;i<=nr_comp;i++)
        {
            for(j=0;j<SOL[i].size();j++)
                g<<SOL[i][j]<<" ";
            g<<'\n';
        }
    }
    return 0;
}