Pagini recente » Cod sursa (job #2447223) | Cod sursa (job #530488) | Cod sursa (job #2812375) | Cod sursa (job #2109782) | Cod sursa (job #317014)
Cod sursa(job #317014)
# 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)
{
k=p->info;
v=new nod;
v->info=k;
v->urm=q->urm;
q->urm=v;
a[k2]=a[k2]->urm;
p=a[k];
if (a[k]->info==k2)
{
a[k]=a[k]->urm;
}
else
{
while (p->urm->urm)
{
if (p->urm->info==k2)
{
v=p->urm;
p->urm=v->urm;
}
if (p)
p=p->urm;
}
if (p)
if (p->urm->info==k2)
p->urm=0;
}
}
q=q->urm;
}
}
int main ()
{
freopen ("ciclueuler.in","r",stdin);
freopen ("ciclueuler.out","w",stdout);
scanf ("%i%i",&n,&m);
for (i=1;i<=m;i++)
{
scanf ("%i%i",&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 ("%i ",z->info);
z=z->urm;
}
}
return 0;
}