Cod sursa(job #525746)

Utilizator crushackPopescu Silviu crushack Data 26 ianuarie 2011 01:40:11
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>
#include <vector>
#include <stack>
#define NMax 100000
using namespace std;

const char IN[]="ctc.in",OUT[]="ctc.out";

int N,M,Sols;
int index;
int ind[NMax] , lowlink[NMax];
bool inStack[NMax];
vector<int> v[NMax];
vector< vector<int> > Sol;
vector<int> s;
stack<int> S;

int min(int x,int y)
{
	return x<y ? x : y;
}

void tarjan(int x)
{
	vector<int>::iterator it;
	ind[x]= lowlink[x]= ++index;
	inStack[x]=true;
	S.push(x);
	
	for ( it = v[x].begin() ; it<v[x].end() ; ++it)
		if ( !ind[*it] )
			tarjan(*it),
			lowlink[x]= min(lowlink[x],lowlink[*it]);
		else if ( inStack[*it] )
			lowlink[x]= min(lowlink[x],ind[*it]);
	
	if ( lowlink[x] == ind[x])
	{
		s.clear();
		++Sols;
		int vp = -1;
		while (vp != x)
		{
			vp=S.top();S.pop();
			//printf("%d ",vp+1);
			s.push_back(vp+1);
		}
		Sol.push_back(s);
	}
}

int main()
{
	int i,j,x,y;
	freopen(IN,"r",stdin);
	scanf("%d%d",&N,&M);
	for (i=0;i<M;++i)
	{
		scanf("%d%d",&x,&y);
		v[x-1].push_back(y-1);
	}
	
	for (i=0;i<N;++i) if ( !ind[i])
		tarjan(i);
	
	freopen(OUT,"w",stdout);
	printf("%d\n",Sols);
	for (i=0;i<Sols;++i)
	{
		for ( vector<int>::iterator it = Sol[i].begin() ; it<Sol[i].end();++it)
			printf("%d ",*it);
		printf("\n");
	}
	fclose(stdout);
	
	return 0;
}