Cod sursa(job #584485)

Utilizator bugyBogdan Vlad bugy Data 25 aprilie 2011 16:51:50
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<stdio.h>
#include<stdlib.h>
#define dim 100005
using namespace std;

int v[5*dim],viz[dim],NR,nr,*M[dim],*A[dim],n,m,i,x,y;


FILE *f=fopen("ciclueuler.in","r"), *g=fopen("ciclueuler.out","w");
	
void afisare()
{
	for(i=1;i<=nr;i++)
		fprintf(g,"%d ",v[i]);
	fprintf(g,"\n");
	
fclose(f);
fclose(g);
}

void euler(int x)
{
	int ok,i;
	for(i=1;i<=A[x][0];i++)
	{
		if(A[x][i]==1) {afisare(); exit(0);}
		if(!M[x][i])
		{
		M[x][i]=1;
		v[++nr]=A[x][i];
		
			if(viz[A[x][i]] ==  0)
				{NR++;		
				viz[A[x][i]] = 1;
				ok=1;	
				}
		
		euler(A[x][i]);
		
		v[nr--]=0;
		
		M[x][i]=0;
		
		if(ok)
			{NR--;
			viz[A[x][i]] =  0;	}
		}
		
	}

//if(NR==n-1) {afisare(); exit(0);}
}

int main()
{
	fscanf(f,"%d %d",&n,&m);
	for(i=1;i<=n;i++)
	{
		A[i]=(int *) realloc(A[i],sizeof(int));
		A[i][0]=0;		
		
		M[i]=(int *) realloc(M[i],sizeof(int));
		M[i][0]=0;		
		
	}
	for(i=1;i<=m;i++)
	{
		fscanf(f,"%d %d",&x,&y);
		A[x][0]++;
		A[x]=(int*) realloc(A[x],(A[x][0]+1) * sizeof(int));
		A[x][A[x][0]]=y;
		
			
		M[x][0]++;
		M[x]=(int*) realloc(M[x],(M[x][0]+1) * sizeof(int));
		M[x][M[x][0]]=0;
		
		
	}
	euler(1);
	if(NR==n-1) {afisare(); exit(0);}
	fprintf(g,"-1\n");
fclose(f);
fclose(g);
}