Cod sursa(job #2305494)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 20 decembrie 2018 13:15:25
Problema Componente biconexe Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <iostream>
#include <set>
#include <stack>
#include <vector>
#include <algorithm>
 
using namespace std;
 
#define MAXN 100001
 
int M,N;

vector<int> L[MAXN]; 
vector<int> LEVEL;
vector<int> LOWER;
 
vector < set<int> > C;
 
stack<pair<int,int>> S;
  
void cache_bc(int node1, int node2){
    set<int> con; 
	int elem1, elem2;
    do {
		elem1 = S.top().first;
		elem2 = S.top().second;
        S.pop();
		con.insert(elem1);
		con.insert(elem2);
    }
    while(elem1!=node1 || elem2!=node2);
    C.push_back(con);
}
 
void depth(int node, int prev, int level){
    vector <int>::iterator it;
 
    LEVEL[node]=level;
	LOWER[node]=level;

    for (it = L[node].begin(); it != L[node].end(); it++) {
        if (*it == prev)   
			continue ;
        if (LEVEL[*it] == -1) { // nod nevizitat
            S.push(make_pair(node,*it));
            depth(*it, node, level + 1);
			if(LOWER[node] > LOWER[*it])
				LOWER[node] = LOWER[*it];
			if(LOWER[*it] >= LEVEL[node])
                cache_bc(node,*it);
        }
		else{ // nod parinte
            if(LOWER[node] > LEVEL[*it])
				LOWER[node] = LEVEL[*it];
		}
    }
}

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

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

	LEVEL.resize(N+1);
	LOWER.resize(N+1);


	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);
	}

	for(int i=1;i<=N;i++)
		LEVEL[i]=-1;

	depth(1, 0, 0);

	printf("%d\n",C.size());
    for (int i = 0; i < C.size(); i++) {
		set<int>::iterator it;
		for (it = C[i].begin(); it!=C[i].end(); it++)
            printf("%d ",*it);
		printf("\n");
    }

    return 0;
}