Pagini recente » Cod sursa (job #801557) | Cod sursa (job #2745922) | Cod sursa (job #1499662) | Cod sursa (job #1739723) | Cod sursa (job #497268)
Cod sursa(job #497268)
#include <stdio.h>
const int maxn=100001;
struct nod {
int inf;
nod *next;
} *A[maxn],*Sol;
int i,N,M,NR,Gr[maxn],ind[maxn],st[maxn];
void add_v(int x, int y)
{
nod *q=new nod;
q->inf=y;
q->next=A[x];
A[x]=q;
Gr[x]++;
}
void sterge_muchie(int x, int y)
{
nod *q;
if(A[x]->inf==y) A[x]=A[x]->next;
else
{
for(q=A[x];q->next->inf!=y;q=q->next);
q->next=q->next->next;
}
if(A[y]->inf==x) A[y]=A[y]->next;
else
{
for(q=A[y];q->next->inf!=x;q=q->next);
q->next=q->next->next;
}
}
void add_s(int p)
{
NR++;
nod *s=new nod;
s->inf=p;
s->next=Sol;
Sol=s;
}
void ciclu()
{
int x,v;
v=1; st[v]=1;
while(v)
{
x=st[v];
if(A[x])
{
st[++v]=A[x]->inf; //introducem un vecin aleator
sterge_muchie(x,st[v]); //stergem muchia respectiva
}
else
add_s(st[v--]); //cand nu mai are vecini, il introducem ca sol
}
}
void afisare()
{
for(;Sol->next;Sol=Sol->next)
printf("%d ",Sol->inf);
}
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d %d",&N,&M);
for(i=1;i<=M;i++) //citire
{
int x,y;
scanf("%d %d",&x,&y);
add_v(x,y);
add_v(y,x);
}
for(i=1;i<=N;i++) //verificarea existentei unui ciclu conform teoremei
if(Gr[i]%2!=0)
{
printf("-1");
return 0;
}
ciclu();
if(NR-1==M) afisare();
else printf("-1");
}