Cod sursa(job #1690788)

Utilizator TibixbAndrei Tiberiu Tibixb Data 15 aprilie 2016 20:03:59
Problema Componente biconexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<fstream>
#include<vector>
#include<stack>
using namespace std;
vector<int> L[100005], bc[100005];
stack<pair<int, int> > s;
int n, m, i, x, y, niv[100005], low[100005], nrbc, j;
void biconex(int nod, int fiu)
{
    nrbc++;
    do
    {
        x=s.top().first;
        y=s.top().second;
        bc[nrbc].push_back(y);
        s.pop();
    }
    while(x!=nod && y!=fiu);
    bc[nrbc].push_back(nod);
}
void dfsbc(int nod, int tata, int lvl)
{
    niv[nod]=low[nod]=lvl;
    for(int i=0; i<L[nod].size(); i++)
    {
        int fiu=L[nod][i];
        if(fiu!=tata)
        {
            if(niv[fiu]==0)
            {
                s.push(make_pair(nod, fiu));
                dfsbc(fiu, nod, lvl+1);
                low[nod]=min(low[nod], low[fiu]);
                if(low[fiu]>=niv[nod])
                    biconex(nod, fiu);
            }else
            {
                low[nod]=min(low[nod], low[fiu]);
            }
        }
    }
}
ifstream in("biconex.in");
ofstream out("biconex.out");
int main()
{
    in>>n>>m;
    for(i=1; i<=m; i++)
    {
        in>>x>>y;
        L[x].push_back(y);
        L[y].push_back(x);
    }
    for(i=1; i<=n; i++)
    {
        if(niv[i]==0)
            dfsbc(i, 0, 1);
    }
    out<<nrbc<<"\n";
    for(i=1; i<=nrbc; i++)
    {
        for(j=0; j<bc[i].size(); j++)
            out<<bc[i][j]<<" ";
        out<<"\n";
    }
    return 0;
}