Cod sursa(job #388746)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 30 ianuarie 2010 20:23:03
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
# include <fstream.h>
ifstream f ("ciclueuler.in");
ofstream g ("ciclueuler.out");
int s[100005],i,n,m,x,y,k,ok;

struct nod
{
	int info;
	nod *urm;
}*p,*a[100005],*z,*q,*w,*v;

  void df (int x)
  {
	  nod *p;
	  s[x]=1;
	  p=a[x];
	while (p)
	{
		if (s[p->info]==0)
		df (p->info);
		p=p->urm;
	}
  }

  
  void sterg (int x,int y)
  {
	  nod *p;
	  p=a[x];
	  if (p)
	  if (p->info==y)
		  a[x]=a[x]->urm;
		  else
	  while (p)
	  {
		  if (p->urm && p->urm->info==y)
		  { 
			  if (p->urm->urm)
			  p->urm=p->urm->urm;
			  else
				  p->urm=0;
		  }
	  p=p->urm;
	  }
  }
  
  
  
  
  
  
  void ciclu (int x)
  {
	p=a[x];
	a[x]=a[x]->urm;
	sterg (p->info,x);
    w=new nod;
	w->info=p->info;
	if (z->urm)
	w->urm=z->urm;
	else
		w->urm=0;
	z->urm=w;
	z=w;
	k++;
	if (a[p->info])
		ciclu (p->info);
  }
  
  
  

int main ()
{
	f>>n>>m;
	for (i=1;i<=m;i++)
	{
		f>>x>>y;
		p=new nod;
		p->info=x;
		p->urm=a[y];
		a[y]=p;
		p=new nod;
		p->info=y;
		p->urm=a[x];
		a[x]=p;
	}
	ok=0;
	for (i=1;i<=n;i++)
	{
		k=0;
		p=a[i];
		while (p)
		{	
			k++;
		    p=p->urm;
		}
		if (k%2==1)
			ok=1;
	}
	
	df (1);
	for (i=1;i<=n;i++)
		if (s[i]==0)
			ok=1;
		
		if (ok==1)
		g<<"-1";
		else
			
		{
			v=new nod;
			v->info=1;
			v->urm=0;
			q=v;
			
			while (q)
			
			{
				z=q;
				
				if (a[q->info])
				ciclu (q->info);
				q=q->urm;
				
			}
		}
	
while (v->urm)
{
	g<<v->info<<" ";
	v=v->urm;
	k++;
}
		
return 0;
}