Cod sursa(job #292429)

Utilizator spidyvenomMarius Toma spidyvenom Data 31 martie 2009 09:52:29
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<fstream.h>
#define nmax 100001
#define mmax 500001
int sol[mmax],grd[nmax],s[mmax],v[nmax],nr,n,m;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

struct nod
{int z;nod *adr;};
nod *c,*l[nmax];

void graf()
{
int i,j;
nod *c;
f>>n>>m;
while (f>>i>>j)
{c=new nod;c->z=j;c->adr=l[i];l[i]=c;grd[j]++;
c=new nod;c->z=i;c->adr=l[j];l[j]=c;grd[i]++;}
}

int verif()
{
for (int i=1;i<=n;i++)
	if (grd[i]%2 || !v[i]) return 0;
return 1;
}

void sterg(int i,int j)
{
 nod *p=l[i];
 l[i]=l[i]->adr;
 delete p;;
if(l[j]->z!=i)
 {
 for(p=l[j];p->adr;p=p->adr)
	 if(p->adr->z==i)
	 {
	 nod *u=l[j]->adr;
	 p->adr=p->adr->adr;
	 delete u;
	 break;
	 }
 }
 else
	 {
	 p=l[j];
	 l[j]=l[j]->adr;
	 delete p;
	 }
}

void euler()
{
	 int vf=1;
	 s[vf]=1;
	 while(vf)
	 {
		  int x=s[vf];
		  if(l[x])
		  {
				vf++;s[vf]=l[x]->z;
				sterg(x,l[x]->z);

		  }
		  else
				sol[++nr]=s[vf--];
	 }
}

void dfs(int x)
{
nod *c;
v[x]=1;
c=l[x];
while(c)
  {
  if(v[c->z]==0) dfs(c->z);
  c=c->adr;
  }
}


int main()
{
graf();
dfs(1);
if (verif())
	{
	euler();
	for (int i=1;i<nr;i++) g<<sol[i]<<" ";
	//cout<<'\n';
	}
else g<<-1<<'\n';
f.close();
g.close();
return 0;
}