Cod sursa(job #411892)

Utilizator bora_marianBora marian bora_marian Data 5 martie 2010 10:56:41
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<fstream>
using namespace std;
int n,m,nrc,ordine[100005],v[100005],vt[100005],timp;
struct nod{
	int info;
    nod *next;};
nod *g[100005],*gt[100005],*CTC[100005];
void adaugat(int a,int b);
void dfs(int k);
void dfst(int k,int nrc);
void kosaraju();
void adauga(int a,int b);
void afisare();
int main()
{
	ifstream fin("ctc.in");
	fin>>n>>m;
	int i;
	for(i=1;i<=m;i++)
	{
		int a,b;
		fin>>a>>b;
		adauga(a,b);
		adaugat(a,b);
	}
	kosaraju();
	afisare();
	return 0;
}
void dfs(int k)
{
	v[k]=1;
	for(nod *p=g[k];p;p=p->next)
		if(v[p->info]==0)
			dfs(p->info);
	ordine[++timp]=k;
}
void dfst(int k,int nrc)
{
	vt[k]=nrc;
	nod *q=new nod;
	q->info=k;
	q->next=CTC[nrc];
	CTC[nrc]=q;
	for(nod *p=gt[k];p;p=p->next)
		if(vt[p->info]==0)
			dfst(p->info,nrc);
}
void kosaraju()
{
	int i;
	for(i=1;i<=n;i++)
		if(v[i]==0)
			dfs(i);
	for(i=timp;i;--i)
        if(vt[ordine[i]]==0)
        {    
			dfst(ordine[i],++nrc);
		}
}
void adauga(int a,int b)
{
	nod *p=new nod;
	p->info=b;
	p->next=g[a];
	g[a]=p;
}
void adaugat(int a,int b)
{
	nod *p=new nod;
	p->info=a;
	p->next=gt[b];
	gt[b]=p;
}
void afisare()
{
	freopen("ctc.out","w",stdout);
	printf("%d",nrc);
	printf("\n");
	int i;
	for(i=1;i<=nrc;i++)
	{
		for(nod *p=CTC[i];p;p=p->next)
			printf("%d ",p->info);
		printf("\n");
	}
}