Cod sursa(job #439968)

Utilizator GodiesVlad Voicu Godies Data 11 aprilie 2010 21:06:47
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
/*
 * PA 2010
 * Laborator 7 - Aplicatii DFS
 *
 * Determinarea componentelor tare conexe
 *
 */

#include <cstdio> // printf, scanf
#include <iostream>
#include <fstream>
#include <vector>               
#include <stack>

using namespace std;

#define min(a, b) ((a) < (b) ? (a) : (b))
 
enum culoare {ALB, GRI, NEGRU};
typedef vector<int> *graf_t; 
 
int n, m;
graf_t G, GT; // lista de adiacenta si transpusa
stack<int> S;
culoare *c;
vector <vector<int> > sol;

void read_data(const char *filename)
{
	ifstream fin;
	int x, y;
	fin.open(filename);
	fin >> n >> m;
	G = new vector<int>[n];
	GT = new vector<int>[n];
	for (int i = 0; i < m; i++) {
		fin >> x >> y;
		x--; y--; // indexare de la 0
		G[x].push_back(y);
		GT[y].push_back(x);
	}
}

/* Kosaraju */
void dfs(int v, graf_t lst)
{
	c[v] = GRI;
	for (int i = 0; i < lst[v].size(); i++) {
		int u = lst[v][i];
    	if (c[u] == ALB)
			dfs(u, lst);
	}
	c[v] = NEGRU;
	S.push(v);
}                      

void dfsT(int v, graf_t lst, vector<int> &comp)
{
	c[v] = GRI;
	comp.push_back(v);
	for (int i = 0; i < lst[v].size(); i++) {
		int u = lst[v][i];
    	if (c[u] == ALB)
			dfsT(u, lst, comp);
	}
	c[v] = NEGRU;
}                      

void ctc_kosaraju()
{
	c = new culoare[n];

	for (int i = 0; i < n; i++) 
		c[i] = ALB;
	for (int v = 0; v < n; v++)
		if (c[v] == ALB) {
			dfs(v, G);
		}
	for (int i = 0; i < n; i++)
		c[i] = ALB;
	while (!S.empty()) {
		int vf = S.top();
		S.pop();
		if (c[vf] == ALB) {
			// o noua componenta
			vector<int> temp;
			dfsT(vf, GT, temp);
			sol.push_back(temp);
		}
	}
}

void print_sol(const char *filename)
{
	ofstream fout;
	fout.open(filename);
	fout << sol.size() << endl;
	for (int i = 0; i < sol.size(); i++) {
		for (int j = 0; j < sol[i].size(); j++)
			fout << sol[i][j] + 1 << " ";
		fout << endl;
	}
	fout.close();
}

int main()
{   
    read_data("ctc.in");
	ctc_kosaraju();
	print_sol("ctc.out");
	return 0;
}