Cod sursa(job #2264172)

Utilizator EclipseTepes Alexandru Eclipse Data 19 octombrie 2018 20:52:09
Problema Componente biconexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
#define dMAX 100000

using namespace std;

int n, m, x, y, nrComp;
int myStack[dMAX + 2], h;
vector<int> graf[dMAX + 2];
vector<int> componente[dMAX + 2];
bool viz[dMAX + 2];
int nivel[dMAX + 2], nivmin[dMAX + 2];

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

void DFS(int k, int p) {
    viz[k] = true;
    myStack[++h] = k;
    nivel[k] = nivel[p] + 1;
    nivmin[k] = nivel[k];
    int i, j, newV;
    for (i = 0; i < graf[k].size(); i++) {
        newV = graf[k][i];
        if (viz[newV]) {
            nivmin[k] = min(nivmin[k], nivel[newV]);
        } else {
            DFS(newV, k);
            nivmin[k] = min(nivmin[k], nivmin[newV]);
            if (nivel[k] <= nivmin[newV]) {
                nrComp++;
                componente[nrComp].push_back(k);
                while (myStack[h] != newV) {
                    componente[nrComp].push_back(myStack[h--]);
                }
                componente[nrComp].push_back(myStack[h--]);
            }

        }
    }
}

int main()
{
    int i, j;
    fin >> n >> m;
    for (i = 1; i <= m; i++) {
        fin >> x >> y;
        graf[x].push_back(y);
        graf[y].push_back(x);
    }

    DFS(1, 0);

    fout << nrComp << '\n';
    for (i = 1; i <= nrComp; i++) {
        for (j = 0; j < componente[i].size(); j++) {
            fout << componente[i][j] << ' ';
        }
        fout << '\n';
    }

    return 0;
}