Cod sursa(job #883626)

Utilizator julianvladucuVladucu Iuliu Cristian julianvladucu Data 20 februarie 2013 10:51:06
Problema Componente tare conexe Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<iostream>
#include<fstream>
using namespace std;
unsigned int viz[5000],a[5000][5000],b[5000][5000],st[5000],n,m,vf,nc;
void transpus(){
for(unsigned int i=1;i<=n;i++)
	for(unsigned int j=1;j<=n;j++)
		if(a[i][j]==1)b[j][i]=1;
}
void df(unsigned int nod){
	viz[nod]=1;
	for(unsigned int i=1;i<=n;i++)
		if(viz[i]==0&&a[nod][i]==1)
			df(i);
	st[++vf]=nod;
}
void dft(unsigned int nod,unsigned int nc){
	viz[nod]=nc;
	for(unsigned int i=1;i<=n;i++)
		if(viz[i]==0&&b[nod][i]==1)
			dft(i,nc);
}
int main(){
	fstream f("ctc.in",ios::in);
	fstream g("ctc.out",ios::out);
	unsigned int i,j;
	f>>n>>m;
	for(unsigned int k=0;k<m;k++){
		f>>i>>j;
		a[i][j]=1;
	}
	f.close();
	transpus();
	vf=0;
	for(i=1;i<=n;i++)viz[i]=0;
	for(i=1;i<=n;i++)
		if(viz[i]==0)
			df(i);
	for(i=1;i<=n;i++)viz[i]=0;
	while(vf>0){
		if(viz[st[vf]])vf--;
		else 
			dft(st[vf--],++nc);
	}
	g<<nc<<"\n";
	for(i=1;i<=nc;i++){
		for(j=1;j<=n;j++)
			if(viz[j]==i)g<<j<<" ";
		g<<"\n";
	}
	g.close();
	return 0;
}