Cod sursa(job #1965808)

Utilizator razvandRazvan Dumitru razvand Data 14 aprilie 2017 17:02:44
Problema Componente biconexe Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

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

vector<int> v[100003];
int disc[100003];
int low[100003];
int parent[100003];
stack<pair<int, int>> S;
int tim;
vector<int> C[100003];
int am;
int root;

void magic(int x, int y) {
    int tx,ty;
    am++;
    cout << am << " " << S.size() << '\n';
    do {
        if(S.empty())
            return;
        tx =  S.top().first;
        ty = S.top().second;
        C[am].push_back(tx);
        C[am].push_back(ty);
        S.pop();
        cout << tx << " " << ty << " " << x << " " << y << '\n';
    } while(tx != x || ty != y);
}

void dfs(int nod) {

    cout << nod << " " << disc[nod] << '\n';
    disc[nod] = ++tim;
    //cout << am << '\n';
    low[nod] = disc[nod];
    int nx;

    for(int i = 0; i < v[nod].size(); i++) {

        nx = v[nod][i];
        //cout << nod << " " << nx << " " << parent[nx] << '\n';

        if(disc[nx] == 0) {

            S.push({nod, nx});
            parent[nx] = nod;
            dfs(nx);
            low[nod] = min(low[nod], low[nx]);
            //cout << nod << " " << nx << " " << disc[nod] << " " << low[nx] << '\n';

            if(disc[nod] <= low[nx])
                magic(nod, nx);

        } else if(parent[nod] != nx)
            low[nod] = min(low[nod], disc[nx]);

    }

}

int main() {

    int n,m;
    in >> n >> m;
    int x,y;

    for(int i = 1; i <= m; i++) {
        in >> x >> y;
        v[x].push_back(y);
        v[y].push_back(x);
    }

    for(int i = 1; i <= n; i++) {
        if(disc[i] == 0) {
            root = i;
            dfs(i);
        }
        if(!S.empty())
            magic(0,0);
    }

    cout << "TEST0";
    out << am << '\n';

    for(int i = 1; i <= am; i++) {
        sort(C[i].begin(), C[i].end());
        C[i].resize(distance(C[i].begin(), unique(C[i].begin(), C[i].end())));
        for(int j = 0; j < C[i].size(); j++)
            out << C[i][j] << " ";
        out << '\n';
    }

    return 0;
}