Cod sursa(job #1539140)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 30 noiembrie 2015 12:29:44
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <algorithm>

using std::min;

const int MAX_N = 1e5;
const int MAX_M = 2e5;
const int NIL = -1;

struct cell {
	int v, next;
};

cell l[MAX_M];
int adj[MAX_N];

int indx[MAX_N];
int nextIndex;

int st[MAX_N], ss;
bool onStack[MAX_N];

int scc[MAX_N];
int numScc;

int dfs(int u) {
	int v, minPtr;

	indx[u] = minPtr = nextIndex++;
	st[ss++] = u;
	onStack[u] = true;

	for (int i = adj[u]; i != NIL; i = l[i].next) {
		v = l[i].v;
		if (indx[v] == NIL) {
			minPtr = min(minPtr, dfs(v));
		} else if (onStack[v]) {
			minPtr = min(minPtr, indx[v]);
		}
	}

	if (minPtr == indx[u]) {
		do {
			v = st[--ss];
			onStack[v] = false;
			scc[v] = numScc;
		} while (u != v);
		numScc++;
	}
	return minPtr;
}

void addEdge(int u, int v, int pos) {
	l[pos].v = v;
	l[pos].next = adj[u];
	adj[u] = pos;
}

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

	scanf("%d%d", &N, &M);
	for (int i = 0; i < N; i++) {
		adj[i] = indx[i] = NIL;
	}
	for (int i = 0; i < M; i++) {
		int u, v;
		scanf("%d%d", &u, &v);
		addEdge(u - 1, v - 1, i);
	}
	fclose(stdin);

	for (int i = 0; i < N; i++) {
		if (indx[i] == NIL) {
			dfs(i);
		}
	}
	
	printf("%d\n", numScc);
	for (int i = 0; i < numScc; i++) {
		for (int j = 0; j < N; j++) {
			if (scc[j] == i) {
				printf("%d ", 1 + j);
			}
		}
		putchar('\n');
	}
	fclose(stdout);
	return 0;
}