Cod sursa(job #1134200)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 6 martie 2014 10:28:23
Problema Componente biconexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <vector>
using namespace std;

vector <int> g[nmax];
vector <int> r;
int niv[nmax];
int low[nmax];
bool viz[nmax];
int n,m,snr;

void afisaza(int start) {
	viz[start] = true;
	printf("%d ",start);
	for (vector <int> :: iterator it = g[start].begin();it != g[start].end();it++) {
		if (!viz[*it]) afisaza(*it);
	}
}

int dfs(int start) {
	viz[start] = true;
	int lowest = nmax+1;
	for (vector <int> :: iterator it = g[start].begin();it != g[start].end();it++) {
		if (viz[*it]) {
			lowest = minim(lowest,niv[*it]);
			continue;
		}
		if (start == 1) snr++;
		niv[*it] = niv[start] +1;
		low[start] = dfs(*it);
	}
	return lowest;
}

int main() {
	freopen("biconex.in","r",stdin);
	freopen("biconex.ut","w",stdout);
	scanf("%d %d",&n,&m);
	for (int i=1;i<=m;i++) {
		int a,b;
		scanf("%d %d",&a,&b);
		g[a].push_back(b);
		g[b].push_back(a);
	}
	niv[1] = 1;
	dfs(1);
	if (snr > 1) r.push_back(1);
	for (int i=2;i<=n;i++) {
		for (vector <int> :: iterator it = g[i].begin();it != g[i].end();it++) {
			if (low[i] != low[*it]) r.push_back(i);
		}
	}
	printf("%d\n",r.size()+1);
	for (int i=1;i<=n;i++) viz[i] = false;
	for (vector <int> :: iterator it = r.begin();it != r.end();it++) viz[*it] = true;
	for (int i=1;i<=n;i++) {
		if (!viz[i]) afisaza(i);
		printf("\n");
	}
	return 0;
}