Cod sursa(job #1028725)

Utilizator devill_08Buli.vlad devill_08 Data 14 noiembrie 2013 16:55:10
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
#define NMAX 150000



int st[NMAX],nr_n,a[10000][10000],grad[NMAX],viz[NMAX];

void afiseaza(int k)
{
	for(int i=1;i<k;i++) 
		if(i<k-1) printf("%d ", st[i]);
		else  printf("%d", st[i]);
}

bool solutie(int k)
{
	for(int i=1;i<=nr_n;i++)
		for(int j=1;j<nr_n;j++) if(a[i][j]!=0) return false;
	return true;
}

bool ev(int k)
{
	if(viz[st[k]]>grad[st[k]])return false;
	return true;
}

void back(int k)
{
	int x;
	for(x=1;x<=nr_n;x++)
	{
		if(a[st[k-1]][x]==1)
		{
			st[k]=x;
			viz[x]++;
			a[st[k-1]][x]=0;
			a[x][st[k-1]]=0;
			if(ev(k)) 
			{
				if(solutie(k)) afiseaza(k);
				else back(k+1); 
			}
			else
			{
				a[st[k-1]][x]=1;
				a[x][st[k-1]]=1;
				viz[x]--;
			}
		}
	}
}

int main()
{
	freopen ("ciclueuler.in","r",stdin);
	freopen ("ciclueuler.out","w",stdout);
	int nr_m,i,x,y,par=0;
	scanf("%d %d", &nr_n,&nr_m);
	for(i=0;i<nr_m;i++)
	{
		scanf("%d %d", &x, &y);
		a[x][y]=a[y][x]=1;
		grad[x]++; grad[y]++;
	}
	for(i=0;i<nr_n;i++)
		if(grad[i]%2!=0) {par=i; break;}
	if(par!=0) printf("-1");//{st[1]=par;viz[par]=1; back(2);}
		else {st[1]=1; viz[par]=1; back(2);}
	return 0;
}