Cod sursa(job #2392905)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 30 martie 2019 16:25:49
Problema Componente biconexe Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

const int NMax = 1e5;

int N, M, Lev[NMax + 5], MinLev[NMax + 5], Ans;
bool Viz[NMax + 5], A[NMax + 5];

vector <int> G[NMax + 5];

void DFS(int Nod, int Tata)
{
    Viz[Nod] = 1, Lev[Nod] = Lev[Tata] + 1, MinLev[Nod] = Lev[Nod];

    for(auto Vecin : G[Nod])
    {
        if(Viz[Vecin])
            MinLev[Nod] = min(MinLev[Nod], Lev[Vecin]);
        else
        {
            DFS(Vecin, Nod);
            MinLev[Nod] = min(MinLev[Nod], MinLev[Vecin]);

            if(MinLev[Vecin] >= Lev[Nod]) A[Nod] = 1;
        }
    }
}

void Print(int Nod)
{
    Viz[Nod] = 1;

    if(Nod != 1)
        fout << Nod << " ";
    else if(A[1] == 0)
        fout << "\n1 ";

    for(auto Vecin : G[Nod])
    {
        if(Viz[Vecin]) continue;

        if(A[Nod])
            fout << '\n' << Nod <<  " ";

        Print(Vecin);
    }
}

void Read()
{
    fin >> N >> M;

    for(int i = 1, x, y; i <= M; i++)
    {
        fin >> x >> y;

        G[x].push_back(y);
        G[y].push_back(x);
    }
}

void Solve()
{
    if(G[1].size() > 1) A[1] = 1;

    for(int i = 1; i <= N; i++)
    {
        if(A[i] == 0) continue;

        for(auto Vecin : G[i])
            if(Lev[Vecin] == Lev[i] + 1)
                Ans++;
    }
    fout << Ans; memset(Viz, 0, sizeof(Viz));

    Print(1);
}

int main()
{
    Read();
    DFS(1, 0);
    Solve();

    fin.close();
    fout.close();

    return 0;
}