Cod sursa(job #918331)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 18 martie 2013 20:06:17
Problema Componente tare conexe Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb

#include <cstdio>
#include <vector>

const int MAX_N(100001);

int n, m;
std::vector<int> graph [MAX_N];
std::vector<int> components [MAX_N];
std::vector<int> transpose [MAX_N];
bool mark [MAX_N];
int stack [MAX_N], *top(stack);
int c [MAX_N], scc;

inline void read (void)
{
	std::freopen("ctc.in","r",stdin);
	std::scanf("%d %d",&n,&m);
	int x, y;
	for (int i(1) ; i <= m ; ++i)
	{
		std::scanf("%d %d",&x,&y);
		graph[x].push_back(y);
		transpose[y].push_back(x);
	}
	std::fclose(stdin);
}

inline void print (void)
{
	std::freopen("ctc.out","w",stdout);
	std::printf("%d\n",scc);
	int i, j, end;
	for (i = 1 ; i <= scc ; ++i)
	{
		for (j = 0, end = components[i].size() ; j < end ; ++j)
			std::printf("%d ",components[i][j]);
		std::putchar('\n');
	}
	std::fclose(stdout);
}

void dfs_topo (int node)
{
	for (int i(0), end(graph[node].size()) ; i < end ; ++i)
		if (!mark[graph[node][i]])
		{
			mark[graph[node][i]] = true;
			dfs_topo(graph[node][i]);
		}
	++top;
	*top = node;
}

inline void toposort (void)
{
	for (int i(1) ; i <= n ; ++i)
		if (!mark[i])
		{
			mark[i] = true;
			dfs_topo(i);
		}
}

void dfs (int node)
{
	for (int i(0), end(transpose[node].size()) ; i < end ; ++i)
		if (!c[transpose[node][i]])
		{
			c[transpose[node][i]] = scc;
			dfs(transpose[node][i]);
		}
}

inline void Kosaraju (void)
{
	while (top > stack)
	{
		if (!c[*top])
		{
			++scc;
			dfs(*top);
		}
		--top;
	}
	for (int i(1) ; i <= n ; ++i)
		components[c[i]].push_back(i);
}

int main (void)
{
	read();
	toposort();
	Kosaraju();
	print();
	return 0;
}