Cod sursa(job #1028718)

Utilizator devill_08Buli.vlad devill_08 Data 14 noiembrie 2013 16:45:41
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#define NMAX 150000

using namespace std;

fstream f("ciclueuler.in",ios::in);
fstream g("ciclueuler.out",ios::out);

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) g<<st[i]<<" ";
		else  g<<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()
{
	int nr_m,i,x,y,par=0;
	f>>nr_n>>nr_m;
	for(i=0;i<nr_m;i++)
	{
		f>>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) g<<"-1";//{st[1]=par;viz[par]=1; back(2);}
		else {st[1]=1; viz[par]=1; back(2);}
	f.close();
	g.close();
	return 0;
}