Cod sursa(job #289066)

Utilizator cotofanaCotofana Cristian cotofana Data 26 martie 2009 13:14:34
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdio>
#include <vector>
#define dim 100100

using namespace std;

int n, m;
vector<int> gn[dim], gt[dim], used, where, discovered, g[dim];

void dfp(int x, vector<int> *g)
{
	used[x]=1;
	for (vector<int>::iterator it=g[x].begin(); it!=g[x].end(); it++)
		if (!used[*it]) 
			dfp(*it, g);
	discovered.push_back(x);
}

void dfm(int x, vector<int> *g, int count)
{
	where[x]=count;
	for (vector<int>::iterator it=g[x].begin(); it!=g[x].end(); it++)
		if (where[*it]==-1) dfm(*it, g, count);
}

int main()
{
	int i, count=0, x, y;
	freopen("ctc.in", "r", stdin);
	freopen("ctc.out", "w", stdout);
	scanf("%d %d\n", &n, &m);
	for (i=1; i<=m; i++)
	{
		scanf("%d %d\n", &x, &y);
		x--, y--;
		gn[x].push_back(y);
		gt[y].push_back(x);
	}
	used.resize(n);
	used.assign(used.size(), 0);
	for (i=0; i<n; i++)
		if (!used[i]) 
			dfp(i, gn);
	
	where.resize(n);
	where.assign(where.size(), -1);
	for (; discovered.size(); discovered.pop_back())
		if (where[discovered.back()]==-1) 
		{
			dfm(discovered.back(), gt, count);
			count++;
		}
		
	for (i=0; i<n; i++) g[where[i]].push_back(i);
	
	printf("%d\n", count);
	for (i=0; i<count; i++)
	{
		for (vector<int>::iterator it=g[i].begin(); it!=g[i].end(); it++)
			printf("%d ", *it+1);
		printf("\n");
	}
	return 0;
}