Cod sursa(job #827116)

Utilizator zalmanDanci Emanuel Sebastian zalman Data 1 decembrie 2012 17:23:24
Problema Componente tare conexe Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <vector>
#include <stack>
#include <fstream>
#define NMAX 100005
#define pb push_back
using namespace std;

int N, M, cnt;
vector<int> GD[NMAX], GT[NMAX], ind_comp, comp[NMAX];
stack<int> st;
bool viz[NMAX];

void read(void)
{
	int x, y;
	ifstream fin("ctc.in");
	
	fin >> N >> M;
	while(M--)
	{
		fin >> x >> y;
		GD[x].pb(y);
		GT[y].pb(x);
	}
	
	fin.close();
}

void DFSGD(int nod)
{
	viz[nod] = 1;
	for(int i = 0; i < GD[nod].size(); ++i)
		if(!viz[GD[nod][i]])
			DFSGD(GD[nod][i]);
	st.push(nod);
}

void DFSGT(int nod, int indice)
{
	ind_comp[nod] = indice;
	for(int i = 0; i < GT[nod].size(); ++i)
		if(ind_comp[GT[nod][i]] == -1)
			DFSGT(GT[nod][i], indice);	
}
void solve(void)
{
	for(int i = 1; i <= N; ++i)
		if(!viz[i])
			DFSGD(i);
		
	ind_comp.resize(N);
	ind_comp.assign(ind_comp.size()+1, -1);
	
	for(; !st.empty(); st.pop())
	{
		if(ind_comp[st.top()] == -1)
		{
			++cnt;
			DFSGT(st.top(), cnt);
		}
	}
	
	for(int i = 0; i < ind_comp.size(); ++i)
		comp[ind_comp[i]].push_back(i);		
}

void print(void)
{
	ofstream fout("ctc.out");
	
	fout << cnt << "\n";
	for(int i = 1; i <= N; ++i)
	{
		for(int j = 0; j < comp[i].size(); ++j)
			fout << comp[i][j];
		fout << "\n";
	}
	
	fout.close();
}
int main(void)
{
	read();
	solve();
	print();
}