Cod sursa(job #359069)

Utilizator serbanlupulupulescu serban serbanlupu Data 25 octombrie 2009 16:57:23
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
//Algoritmul de depistare a componentelor tari-conexe
//Algoritmul '+' / '-'

#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <string>

using namespace std;

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

void read(const char * buff_file)
{
	//fstream f("RoyWarshall.in", ios::in);
	fstream f("ctc.in", 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.reserve(nodes+1);
		
		for (int i=1; i<=edges; ++i)
		{
			f>>left>>right;
			g[left].push_back(right);
			gt[right].push_back(left);
		}
		f.close();
	}
};

bool * used;
bool * minusDF;
bool * plusDF;

void DFS(int i, vector<vector<int> > &aux, bool *&temp)
{
	for (vector<int >::iterator it = aux[i].begin(); it < aux[i].end(); it++)
	{
		if (temp[*it] == 0 && used[*it]==0)
		{
			temp[*it]=1;
			DFS(*it, aux, temp);
		}
	}
};

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

vector<vector<int > > out;
int nr;

void PlusMinus()
{
	out.reserve(nodes+1);
	out.resize(nodes+1);
	
	queue<int> Q;
	used=new bool[nodes+1];
	minusDF=new bool[nodes+1];
	plusDF=new bool[nodes+1];
	
	set0(used);
	
	for (int i=1; i<=nodes; ++i)
	{
		if (used[i]==0)
		{	
			set0(minusDF);
			set0(plusDF);
			used[i]=1;
			Q.push(i);
			
			nr++;
			
			plusDF[i]=1;
			DFS(i, g, plusDF);
			
			minusDF[i]=1;
			DFS(i, gt, minusDF);
			
			for (int j=1; j<=nodes; ++j)
			{
				if (plusDF[j] && minusDF[j] && used[j]==0)
				{
					Q.push(j);
					used[j]=1;
				}
			}
		}
		if (!Q.empty())
		{
			while (!Q.empty())
			{
				//cout<<Q.front()<<" ";
				//out<<Q.front()<<" ";
				out[nr].push_back(Q.front());
				Q.pop();
			}
			//cout<<"\n";
			//out<<"\n";
		}
	}
}

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

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