Cod sursa(job #687979)

Utilizator gener.omerGener Omer gener.omer Data 22 februarie 2012 21:54:05
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>
#include <vector>
#include <stack>
#include <iostream>

using namespace std;

#define NMAX 100005

int N, M;
vector<int> neigh[NMAX], neigh_T[NMAX];

void read_file(){
	int a,b;
	FILE * f = fopen("ctc.in", "rt");
	fscanf(f, "%d %d", &N, &M);
	for(int i = 0; i < M; ++i){
		fscanf(f, "%d %d", &a, &b);
		neigh[a].push_back(b);
		neigh_T[b].push_back(a);
	}
	fclose(f);
}

vector<int> discovered, discovered1;
vector<int> finishednodes, ctc;
int nr_ctc = 0;

void dfs1(int node){
	discovered[node] = 1;
	for(unsigned i = 0; i < neigh[node].size(); ++i)
		if(!discovered[neigh[node][i]])
			dfs1(neigh[node][i]);
	finishednodes.push_back(node);
}

void dfs2(int node){
	ctc[node] = nr_ctc;
	discovered1[node] = 1;
	for(unsigned i = 0; i < neigh_T[node].size(); ++i)
		if(!discovered1[neigh_T[node][i]])
			dfs2(neigh_T[node][i]);
}

void dfs_1(){
	discovered.resize(N+1);
	for(int i = 1; i <= N; ++i)
		if(!discovered[i])
			dfs1(i);
}

void dfs_2(){
	discovered1.resize(N+1);
	ctc.resize(N+1);
	for(int i = finishednodes.size() - 1; i >= 0; --i)
		if(!discovered1[finishednodes[i]]){
			++nr_ctc;
			dfs2(finishednodes[i]);
		}
	//for(int i = 1; i <= N; ++i)
	//	printf("%d ", ctc[i]);
	//printf("\n");	
	//printf("%d\n", nr_ctc);	
}

void print(){
	vector<int> comp[NMAX];
	for(int i = 1; i <= N; ++i)
		comp[ctc[i]].push_back(i);	
	FILE * f = fopen("ctc.out", "wt");
	fprintf(f, "%d\n", nr_ctc);
	for(int i = 1; i <= nr_ctc; ++i){
		for(unsigned j = 0; j < comp[i].size(); ++j)
			fprintf(f, "%d ", comp[i][j]);
		fprintf(f, "\n");
	}
	fclose(f);
}

int main(){
	read_file();
	dfs_1();
	dfs_2();
	print();
	return 0;
}