Cod sursa(job #371112)

Utilizator titusuTitus C titusu Data 3 decembrie 2009 20:53:33
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
/**
 * Algoritmul lui Kosaraju
 * 
 * parcurg in adancime graful si determin timpii finali ai nodurilor
 * construiesc graful trasnpus
 * parcurg graful transpus in ordinea data de timpii finali. Fiecare arbore de parcurgere reprezinta o componenta tare conexa
 * 
 * 
 */
#include <cstdio>
using namespace std;
#define MAX 100010

struct nod{
	int info;
	nod * next;
};

nod * G[MAX], * GT[MAX], *CTC[MAX];
int v[MAX], n, nrc, final[MAX], timp, vt[MAX];

void read(){
	freopen("ctc.in","r",stdin);
	int m , i , j;
	nod * p;
	scanf("%d%d", &n , &m);
	for(i = 1;i<=n;i++)
		G[i] = GT[i] = CTC[i] = NULL;
	for( ; m ;--m){
		scanf("%d%d", &i ,&j);
		p= new nod ; p->info = j; p->next = G[i]; G[i] = p; // graful dat
		p= new nod ; p->info = i; p->next = GT[j]; GT[j] = p;//graful transpus
	}
}

void write(){
	freopen("ctc.out","w", stdout);
	printf("%d\n", nrc);
	for(int i=1;i<=nrc;i++){
		for(nod * p = CTC[i]; p ; p=p->next)
				printf("%d ", p->info);
		printf("\n");
	}
}


void dfs(int varf){//parcurgerea grafului dat, cu determinarea timpilor finali
	v[varf]=1;
	for(nod *p = G[varf]; p ; p = p -> next)
		if(!v[p->info])
			dfs(p->info);
	final[++timp] = varf;
	
}

void dfst(int x, int nrc){//parcurgerea grafului transpus, cu marcarea componentei tare conexe
		vt[x]=nrc;
		nod * p = new nod;
		p -> info = x;
		p->next = CTC[nrc];
		CTC[nrc] = p;
		for(p = GT[x] ; p ; p = p->next)
			if(vt[p->info] ==0)
				dfst(p->info, nrc);
}

void kosaraju(){ 
	for(int i =1 ; i<=n;i++)
		if(v[i]==0)
			dfs(i);
	for(int i=timp;i;i--)
		if(vt[final[i]]==0)
			dfst(final[i], ++nrc);
}

int main(){
	read();
	kosaraju();
	write();
	return 0;
}