Cod sursa(job #2305498)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 20 decembrie 2018 13:18:45
Problema Componente biconexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <iostream>
#include <set>
#include <stack>
#include <vector>
#include <algorithm>
 
using namespace std;
 
#define MAXN  100001

#define Min(a, b)  ((a) < (b) ? (a) : (b))
 
int M,N;

vector<int> L[MAXN]; 
vector<int> dfn, low;
 
vector <vector <int> > C;
 
stack <pair <int, int> > S;
  
void cache_bc(const int x, const int y){
    vector <int> con; 
	int tx, ty;
    do {
        tx = S.top().first;
		ty = S.top().second;
        S.pop();
        con.push_back(tx);
		con.push_back(ty);
    }
    while (tx != x || ty != y);
    C.push_back(con);
}
 
void DF(int node, int fn, int number){
    vector <int>::iterator it;
 
    dfn[node] = low[node] = number;
    for (it = L[node].begin(); it != L[node].end(); it++) {
        if (*it == fn)   continue ;
        if (dfn[*it] == -1) {
            S.push( make_pair(node, *it) );
            DF(*it, node, number + 1);
            low[node] = Min(low[node], low[*it]);
            if (low[*it] >= dfn[node])
                cache_bc(node, *it);
        }
        else
            low[node] = Min(low[node], dfn[*it]);
    }
}

int main(void){
	freopen("biconex.in","r",stdin);
	freopen("biconex.out","w",stdout);

	scanf("%d %d",&N,&M);

	int x,y;
	for(int i=0;i<M;i++){
		scanf("%d %d",&x,&y);
		L[x].push_back(y);
		L[y].push_back(x);
	}

	dfn.resize(N + 1);
	dfn.assign(N + 1, -1);
    low.resize(N + 1);
    DF(1, 0, 0);

	printf("%d\n",C.size());
    for (int i = 0; i < C.size(); i++) {
		sort(C[i].begin(), C[i].end());
        C[i].erase(unique(C[i].begin(), C[i].end()), C[i].end());
        for (int j = 0; j < C[i].size(); j++)
            printf("%d ",C[i][j]);
		printf("\n");
    }

    return 0;
}