Cod sursa(job #770755)

Utilizator ioana26Ioana Andronescu ioana26 Data 23 iulie 2012 19:42:21
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
/*
Componente tare conexe.
*/

#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>

#define MAXN	100050

using namespace std;

int nr_noduri, nr_muchii, nr_comp_conexe;
vector<int> graf_init[MAXN], graf_transpus[MAXN], graf[MAXN];
vector<int> stiva, vizitat, componenta;

void dfs (int u) {
	int i;
	vizitat[u] = true;
	for (i = 0; i < graf_init[u].size(); i++)
		if (vizitat[graf_init[u][i]] == false)
			dfs(graf_init[u][i]);
	stiva.push_back(u);
}

void kosaraju (int u) {
	int i;
	componenta[u] = nr_comp_conexe;
	for (i = 0; i < graf_transpus[u].size(); i++)
		if (componenta[graf_transpus[u][i]] == -1)
			kosaraju(graf_transpus[u][i]);
}

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

	int i, j, x, y;
	scanf("%d %d", &nr_noduri, &nr_muchii);
	for (i = 0; i < nr_muchii; i++) {
		scanf("%d %d", &x, &y);
		graf_init[x].push_back(y);
		graf_transpus[y].push_back(x);
	}

	vizitat.resize(nr_noduri);
	vizitat.assign(vizitat.size(), 0);

	for (i = 0; i < nr_noduri; i++)
		if (vizitat[i] == false)
			dfs(i);

	componenta.resize(nr_noduri);
	componenta.assign(componenta.size(), -1);
	nr_comp_conexe = 0;
	while (stiva.size() > 0) {
		if (componenta[stiva.back()] == -1) {
			kosaraju(stiva.back());
			nr_comp_conexe++;
		}
		stiva.pop_back();
	}

	for (i = 0; i < nr_noduri; i++)
		graf[componenta[i]].push_back(i);

	printf("%d\n", nr_comp_conexe);

	for (i = 0; i < nr_comp_conexe; i++) {
		for (j = 0; j < graf[i].size(); j++)
			printf("%d ", graf[i][j] + 1);
		printf("\n");
	}

	return 0;
}