Cod sursa(job #590873)

Utilizator maritimCristian Lambru maritim Data 20 mai 2011 20:03:24
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include<stdio.h>
#include<malloc.h>

typedef struct _nod
{
	int info;
	struct _nod *adr;
} nod;

typedef struct
{
	struct _nod *cap;
} list;

list A[100001];
list B[100001];
list W[100001];
int C[100001];
int N;
int M;
int nr;

int add(list A[],int a,int b)
{
	nod *nou = (nod*)malloc(sizeof(nod));
	nou->info = b;
	nou->adr = A[a].cap;
	A[a].cap = nou;
}

void citire(void)
{
	int a;
	int b;
	FILE *f = fopen("ctc.in","r");
	
	fscanf(f,"%d %d",&N,&M);
	for(int i=1;i<=M;i++)
	{
		fscanf(f,"%d %d",&a,&b);
		add(A,a,b);
		add(B,b,a);
	}
	
	fclose(f);
}

int add2(nod*& Cf,int a)
{
	Cf->adr = (nod*)malloc(sizeof(nod));
	Cf->adr->info = a;
	Cf->adr->adr = NULL;
	Cf = Cf->adr;
}

int parcurgere(nod*& start,list A[],int a,int k)
{
	nod *Ci = (nod*)malloc(sizeof(nod));
	Ci->info = a;
	Ci->adr = NULL;
	nod *Cf = Ci;
	start = Ci;
	while(Ci)
	{
		nod *q = A[Ci->info].cap;
		while(q)
		{
			if(C[q->info] == k)
			{
				C[q->info] --;
				if(C[q->info] == -2)
				{
					C[q->info] = nr;
					add(W,nr,q->info);
				}
				else if(k == -1 && C[q->info] == -1)
					C[q->info] = 0;
				add2(Cf,q->info);
			}
			q = q->adr;
		}
		if(k)
		{
		q = Ci;
		Ci = Ci->adr;
		free(q);
		}
		else Ci = Ci->adr;
	}
}

void afisare(void)
{
	FILE *g = fopen("ctc.out","w");
	
	fprintf(g,"%d\n",nr);
	for(int i=1;i<=nr;i++)
	{
		nod *q = W[i].cap;
		while(q)
		{
			fprintf(g,"%d ",q->info);
			q = q->adr;
		}
		fprintf(g,"\n");
	}
	
	fclose(g);
}

int solve(void)
{
	for(int i=1;i<=N;i++)
		if(!C[i])
		{
			nod *q;
			nod *w;
			C[i] = ++nr;
			add(W,nr,i);
			parcurgere(q,A,i,0);
			parcurgere(w,B,i,-1);
			while(q)
			{
				if(C[q->info] == -1)
					C[q->info] = 0;
				w = q;
				q = q->adr;
				free(w);
			}
		}
}

int main()
{
	citire();
	solve();
	afisare();
	return 0;
}