Cod sursa(job #659866)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 11 ianuarie 2012 07:51:40
Problema Componente tare conexe Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.7 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <stack>
#include <bitset>

#define min(a,b)		\
({	typeof(a) _a = (a);	\
	typeof(b) _b = (b);	\
	_a<=_b ? _a : _b;	\
})

#define MAXN	100000

using namespace std;

struct Node
{
	Node() : index(-1), lowlink(0), bIsOnStack(false)
	{}

	int index, lowlink;
	bool bIsOnStack;
};

typedef unsigned int uint32;
typedef vector<vector<int> > Graph;
typedef vector<vector<int> > Scc;

void StronglyConnectedComponent
(
	const Graph& graph,
	Node *nodes,
	stack<int>& S,
	const int node,
	int& index,
	Scc& sccs,
	int& numComp
)
{
	nodes[node].index = index;
	nodes[node].lowlink = index;
	index++;
	S.push(node);
	nodes[node].bIsOnStack = true;
	
	for (int i=0; i<graph[node].size(); ++i)
	{
		if (-1 == nodes[graph[node][i]].index)
		{
			StronglyConnectedComponent(graph, nodes, S, graph[node][i], index, sccs, numComp);
			nodes[node].lowlink = min(nodes[node].lowlink, nodes[graph[node][i]].lowlink);
		}
		else if (nodes[graph[node][i]].bIsOnStack)
		{
			nodes[node].lowlink = min(nodes[node].lowlink, nodes[graph[node][i]].index);
		}
	}
	
	if (nodes[node].lowlink == nodes[node].index)
	{
		int curNode;
		do
		{
			curNode = S.top();
			sccs[numComp].push_back(curNode);
			S.pop();
		} while(!S.empty() && curNode!=node);
		numComp++;
	}
}

int StronglyConnectedComponents(const Graph& graph, Scc& sccs)
{
	int index = 0, numComp = 0;
	Node *nodes;
	stack<int> S;
	
	nodes = new Node[graph.size()+1];
	sccs.resize(graph.size());
	
	for (int i=0; i<graph.size(); ++i)
	{
		if (-1 == nodes[i].index)
		{
			StronglyConnectedComponent(graph, nodes, S, i, index, sccs, numComp);
		}
		
		if (!S.empty())
		{
			int curNode;
			do
			{
				curNode = S.top();
				sccs[numComp].push_back(curNode);
				S.pop();
			} while(!S.empty() && curNode!=i);
			numComp++;
		}
	}
	
	delete[] nodes;
	
	return numComp;
}

int main()
{
	uint32 n, m, numComp;
	Graph graph;
	Scc sccs;
	fstream fin("ctc.in", fstream::in);
	fstream fout("ctc.out", fstream::out);
	
	fin >> n >> m;
	//cout << n << " " << m << endl;
	
	graph.resize(n);
	
	for (int i=0; i<m; ++i)
	{
		uint32 x, y;
		fin >> x >> y;
		
		graph[x-1].push_back(y-1);
	}
	
	/*for (int i=0; i<n; ++i)
	{
		cout << i+1 << ": ";
		for (int j=0; j<graph[i].size(); ++j)
		{
			cout << graph[i][j]+1 << " ";
		}
		cout << endl;
	}
	
	cout << endl;*/
	
	numComp = StronglyConnectedComponents(graph, sccs);
	
	fout << numComp << "\n";
	for (int i=0; i<numComp; ++i)
	{
		for (int j=0; j<sccs[i].size(); ++j)
		{
			fout << sccs[i][j]+1 << " ";
		}
		fout << "\n";
	}
	
	fin.close();
	fout.close();
	return 0;
}