Cod sursa(job #662824)

Utilizator deneoAdrian Craciun deneo Data 17 ianuarie 2012 00:16:23
Problema Componente biconexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

#define pb push_back

vector<int> g[100001];
vector<int> c[100001];

int stiva[100001], how_high[100001], p[100001], n, m;
int viz[100001], sd, t;

void adauga(int nod) {
    ++t;
    while(stiva[sd] != nod) {
        c[t].pb(stiva[sd]);
        --sd;
    }
    c[t].pb(stiva[sd]);
    --sd;
}

void dfs(int nod, int bk) {
    viz[nod] = 1;
    stiva[++sd] = nod;
    p[nod] = p[bk] + 1;
    how_high[nod] = p[nod];
    int mlev = p[nod], i;

    for(i = 0; i < g[nod].size(); ++i) {
        if(viz[g[nod][i]])
            mlev = min(mlev, p[g[nod][i]]);
        else {
            dfs(g[nod][i], nod);
            how_high[nod] = min(how_high[nod], how_high[g[nod][i]]);
            if(how_high[g[nod][i]] == p[nod]) {
                adauga(g[nod][i]);
                c[t].pb(nod);
            }
        }
    }
    how_high[nod] = min(how_high[nod], mlev);
}

int main() {
    int i, j, x, y;
    ifstream fin("biconex.in");
    ofstream fout("biconex.out");
    fin >> n >> m;
    for(i = 1; i <= m; ++i) {
        fin >> x >> y;
        g[y].pb(x);
        g[x].pb(y);
    }

    dfs(1, 0);

    for(i = 1; i <= t; ++i) {
        for(j = 0; j < c[i].size(); ++j) {
            fout << c[i][j] << ' ';
        }
        fout << '\n';
    }
    fout.close();
    return 0;
}