Cod sursa(job #313322)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 8 mai 2009 19:19:36
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
# include <stdio.h>
int s[100001],i,j,n,m,x,y,k,ok,sf,k2;
struct nod
{
int info;
nod *urm;
}*a[100001],*p,*v,*z,*q,*w;

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 ciclu ()
{

  while (q)
   {
   k2=q->info;
    p=a[k2];


   if (p) //daca nodul p->info mai are noduri adiacente
   {
    k=p->info;

    v=new nod; // se introduce nodul in lista initiala
    v->info=k;
    v->urm=q->urm;
    q->urm=v;


    p=a[k2];  //se sterge nodul(muchia) adiacent cu nodul k2
    a[k2]=p->urm;
    delete p;


  p=a[k];   //se sterge nodul(muchia) adiacent cu nodul k
 if (p->info==k2)
  {

   a[k]=p->urm;
   delete p;
   }
 else
  {
  while (p->urm->urm)
  {

   if (p->urm->info==k2)
   {
    v=p->urm;
    p->urm=v->urm;
    delete v;
   }
   p=p->urm;
  }

  if (p->urm->info==k2)
  p->urm=0;

 }


}


q=q->urm;
}
}


int main ()
{
freopen ("ciclueuler.in","r",stdin);
freopen ("ciclueuler.out","w",stdout);
scanf ("%d%d",&n,&m);


for (i=1;i<=m;i++)
{
scanf ("%d%d",&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;
}


for (i=1;i<=n;i++) //se verifica daca graful are ciclu eulerian
{
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)
printf ("-1");

   else    // daca are
   {

z=new nod; //se creaza primul nod al listei in care se memoreaza
z->info=1; //nodurile care fac parte din ciclul lui euler
z->urm=0;
w=z;

   while (z) // se ia cate un nod din lista
   {
    q=z;
    ciclu (); //incearca sa gaseasca inca un ciclu pornind din nodul z->info si il intercaleaza(ciclul) in ciclul initial
    z=z->urm;
   }

 z=w;

   while (z->urm)  // se afiseaza lista cu nodurile ciclului lui euler
    {
     printf ("%d ",z->info);
     z=z->urm;
    }



    }
return 0;
}