Cod sursa(job #2870901)

Utilizator stefantagaTaga Stefan stefantaga Data 12 martie 2022 17:28:25
Problema Componente biconexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("biconex.in");
ofstream g("biconex.out");
int n,m;
vector <int> v[100005],ceau[100005];
int l[100005],viz[100005];
int niv[100005],nrcomp,tata[100005];
stack <pair <int,int>> deq;
void dfs(int x,int nivel)
{
    viz[x]=1;
    l[x]=nivel;
    niv[x]=nivel;
    for (int i=0;i<v[x].size();i++)
    {
        int nod =v[x][i];
        if (viz[nod]==0)
        {
            deq.push({x,nod});
            tata[nod]=x;
            dfs(nod,nivel+1);
            if (l[x]>l[nod])
            {
                l[x]=l[nod];
            }
            if (l[nod]>=niv[x])
            {
                if (deq.empty())
                {
                    continue;
                }
                nrcomp++;
                while (1)
                {
                    int x2 = deq.top().first;
                    int y2 = deq.top().second;
                    ceau[nrcomp].push_back(x2);
                    ceau[nrcomp].push_back(y2);
                    deq.pop();
                    if (x2==x||y2==x)
                    {
                        break;
                    }
                }
            }
        }
        else
        {
            if (nod!=tata[x]&&l[x]>niv[nod])
            {
                l[x]=niv[nod];
            }
        }
    }
}
int i,j;
int main()
{
    f>>n>>m;
    for (i=1;i<=m;i++)
    {
        int x,y;
        f>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    for (i=1;i<=n;i++)
    {
        if (viz[i]==0)
        {
            dfs(i,0);
        }
    }
    g<<nrcomp<<'\n';
    for (i=1;i<=nrcomp;i++)
    {
        sort (ceau[i].begin(),ceau[i].end());
        g<<ceau[i][0]<<" ";
        for (j=1;j<ceau[i].size();j++)
        {
            if (ceau[i][j]!=ceau[i][j-1])
            {
                g<<ceau[i][j]<<" ";
            }
        }
        g<<'\n';
    }
    return 0;
}