Cod sursa(job #2671009)

Utilizator Edwuard99Diaconescu Vlad Edwuard99 Data 11 noiembrie 2020 10:44:39
Problema Componente biconexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include<cstdio>
#include<algorithm>
#include<vector>

using namespace std;

const int maxN=100005;
const int maxM=200005;

vector<int> G[maxN],S[maxN];
int n,m,nr,ns,l[maxN],par[maxN],viz[maxN],lv[maxN],s1[maxM],s2[maxM];

void citire()
{
    freopen("biconex.in","r",stdin);
    freopen("biconex.out","w",stdout);
    scanf("%d%d",&n,&m);
    int x,y;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        G[x].push_back(y);
        G[y].push_back(x);
    }
}

void dfs(int x)
{
    viz[x]=1;
    l[x]=lv[x];
    for(int i=0;i<G[x].size();++i)
    {
        int ff=G[x][i];
        if(!viz[ff])
        {
            lv[ff]=lv[x]+1;
            par[ff]=x;
            ns++; s1[ns]=x; s2[ns]=ff;
            dfs(ff);
            if(l[x]>l[ff])
                l[x]=l[ff];
            if(l[ff]>=lv[x])
            {
                nr++;
                while(!(s1[ns]==x && s2[ns]==ff))
                {
                    S[nr].push_back(s1[ns]);
                    S[nr].push_back(s2[ns]);
                    --ns;
                }
                S[nr].push_back(s1[ns]);
                S[nr].push_back(s2[ns]);
                --ns;
            }
        }
        else
        {
            if(par[x]!=ff && lv[ff]<lv[x])
            {
                if(l[x]>lv[ff])
                    l[x]=lv[ff];
                ns++;
                s1[ns]=x;
                s2[ns]=ff;
            }
        }
    }
}

void afis()
{
    printf("%d\n",nr);
    int i,j;
    for(i=1;i<=nr;i++)
    {
        sort(S[i].begin(),S[i].end());
        for(j=0;j<S[i].size();++j)
            if((j>0 && S[i][j-1]!=S[i][j])||(j==0))
                printf("%d ",S[i][j]);
        printf("\n");
    }
}
int main()
{
    citire();
    int i,j;
    nr=0; i=1;
    dfs(1);
    afis();
    return 0;
}