Cod sursa(job #314285)

Utilizator cvicentiuCiorbaru Vicentiu Marian cvicentiu Data 11 mai 2009 00:31:17
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <stdio.h>
#define MaxN 13
struct vert {
	int inf;
	vert *next;
};
vert *g[MaxN], *gT[MaxN], *lista[MaxN];
int s[MaxN], n, m, current,elem;
int viz1[MaxN];
int viz2[MaxN];
FILE *fin = fopen("ctc.in","r");
FILE *fout = fopen("ctc.out","w");

void add(int x, int val){
	vert *p = new vert;
	p->inf = val;
	p->next = lista[x];
	lista[x] = p;
};

void add_vertex(int v1, int v2){	//add vertex connected from v1 to v2, to graph g;
	vert *p = new vert;
	p->inf = v2;
	p->next = g[v1];
	g[v1] = p;
};
void add_tvertex(int v1, int v2){//add vertex connected from v1 to v2, to graph gT;
	vert *p = new vert;
	p->inf = v2;
	p->next = gT[v1];
	gT[v1] = p;
};

void read(){
	int ex1,ex2;
	fscanf(fin,"%d %d", &n, &m);
	for (int i = 1; i <= n; i++){
		fscanf(fin,"%d %d", &ex1, &ex2);
		add_vertex(ex1,ex2);
		add_tvertex(ex2,ex1);
	};
};

void dfs(int v){
	viz1[v] = -1;
	for (vert *p = g[v]; p != NULL; p = p->next) {
		if (viz1[ p->inf ] == 0)
			dfs(p->inf);
	};
};
void dfsT(int v){
	viz2[v] = -1;
	for (vert *p = gT[v]; p!= NULL; p = p->next)
		if (viz2[ p->inf ] == 0){
			dfsT(p->inf);
		}
}

int main(){
	read();
	current = 0;
	for ( int i = 1; elem < n; i++ ){
		
		if (viz1[i] == 0 && i <= n){
			current++,dfs(i),dfsT(i);
			for (int j = 1; j <= n; j++){
				if (viz1[j] == -1 && viz2[j] == -1){
					add(i,j);
					viz1[j] = current;
					viz2[j] = current;
					elem++;
				} else{
					if (viz1[j] == -1) viz1[j] = 0;
					if (viz2[j] == -1) viz2[j] = 0;
					};
			}
		}
		if (i == n + 1) i = 1;
	}

		
	fprintf(fout,"%d\n", current);
	bool printed;
	for (int i = 1; i <= current; i++){
		printed = false;
		for ( vert *p = lista[i]; p != NULL; p = p->next)
			fprintf(fout,"%d ", p->inf), printed = true;
		if (printed)fprintf(fout,"\n");
	};


}