Cod sursa(job #359081)

Utilizator serbanlupulupulescu serban serbanlupu Data 25 octombrie 2009 18:05:52
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
//Algoritm de depistare a componentelor tare-conexe
// complexitate O(n+m)

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int nodes;
vector<vector<int > > g;
vector<vector<int > > gt;

void read(const char * buff_file)
{
	fstream f(buff_file, ios::in);
	if (f==NULL)
	{
		cerr<<"EROARE!";
		exit(0);
	}
	else
	{		
		int edges,left,right;
		f>>nodes;
		f>>edges;
		
		g.reserve(nodes+1);
		g.resize(nodes+1);
		
		gt.reserve(nodes+1);
		gt.resize(nodes+1);
		
		for (int i=1; i<=edges; ++i)
		{
			f>>left>>right;
			g[left].push_back(right);
			gt[right].push_back(left);
		}
		f.close();
	}
};

int *parcurgere;
int nr_parcurgere;
int *used;

void DFS(int i)			//parcurg DFS graful
{
	for (vector<int >::iterator it=g[i].begin(); it < g[i].end(); it++)
	{
		if (!used[*it])
		{
			used[*it]=1;
			DFS(*it);
			parcurgere[++nr_parcurgere]=*it;
		}
	}		
}

void set0(int *&temp, int nr_temp=nodes)
{
	for (int i=1; i<=nr_temp; ++i)
		temp[i]=0;
}

void print(int *&temp, int nr_temp=nodes)
{
	for (int i=1; i<=nr_temp; ++i)
		cout<<temp[i]<<" ";
	cout<<"\n";
};

vector<vector<int > > out;
int nr_out;

void DFSt(int i, vector<vector<int > > &out) 		//parcurg DFS graful transpus
{
	for (vector<int>::iterator it=gt[i].begin(); it < gt[i].end(); it++)
	{
		if (!used[*it])
		{
			used[*it]=1;
			//cout<<*it<<" ";
			out[nr_out].push_back(*it);
			DFSt(*it, out);
		}
	}
};

void TareConex()
{
	out.reserve(nodes+1);
	out.resize(nodes+1);
	
	parcurgere=new int[nodes+2];
	set0(parcurgere);
	used=new int[nodes+1];
	set0(used);
	for (int i=1; i<=nodes; ++i)
	{
		if (!used[i])
		{
			used[i]=1;
			DFS(i);
			parcurgere[++nr_parcurgere]=i;
		}
	}	
	set0(used);
	
	for (int i=nr_parcurgere; i>=1; --i)
	{
		if (!used[parcurgere[i]])
		{
			++nr_out;
			out[nr_out].push_back(parcurgere[i]);
			//cout<<parcurgere[i]<<" ";
			used[parcurgere[i]]=1;
			DFSt(parcurgere[i],out);
		}
	}
}

void print(const char * out_file)
{
	fstream g(out_file, ios::out);
	g<<nr_out<<"\n";
	for (int i=1; i<=nr_out; ++i)
	{
		for (vector<int>::iterator it=out[i].begin(); it < out[i].end(); it++)
			g<<*it<<" ";
		g<<"\n";
	}
}

int main()
{
	read("ctc.in");
	TareConex();
	print("ctc.out");
	return 0;
}