Cod sursa(job #600503)

Utilizator maritimCristian Lambru maritim Data 1 iulie 2011 22:31:27
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<stdio.h>
#include<malloc.h>

#define MaxN 100100
#define MaxM 300100

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

typedef struct
{
	struct _nod *cap;
} list;

list A[MaxN];
bool viz[MaxM];
int grad[MaxN];
int B[MaxM];
bool vizn[MaxN];
int N;
int M;
FILE *g = fopen("ciclueuler.out","w");

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

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

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

void BFS(int a)
{
	vizn[a] = true;
	nod *Ci = (nod*)malloc(sizeof(nod));
	Ci->info = a;
	Ci->adr = NULL;
	nod *Cf = Ci;
	while(Ci)
	{
		nod *q = A[Ci->info].cap;
		while(q)
		{
			if(!vizn[q->info])
				add2(Cf,q->info);
			q = q->adr;
		}
		q = Ci;
		Ci = Ci->adr;
		free(q);
	}
}

int verif(void)
{
	int i = 1;
	for(i=1;grad[i]%2 == 0 && i<=N;i++);
	if(i <= N)
		return 0;
	BFS(1);
	for(i=1;(vizn[i] || !A[i].cap) && i<=N;i++);
	if(i <= N)
		return 0;
	return 1;
}

void euler(int v,int k)
{
	nod *q = A[v].cap;
	while(q)
	{
		if(!viz[q->poz])
		{
			viz[q->poz] = true;
			euler(q->info,k+1);
		}
		q = q->adr;
	}
	if(k > 1)
		fprintf(g,"%d ",v);
}

void solve(void)
{
	
	if(!verif())
	{
		fprintf(g,"-1\n");
		fclose(g);
		return ;
	}
	euler(1,1);
	fprintf(g,"\n");
	
	fclose(g);
}

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