Pagini recente » Cod sursa (job #115715) | Cod sursa (job #3233008) | Cod sursa (job #2274870) | Cod sursa (job #3290938) | Cod sursa (job #303420)
Cod sursa(job #303420)
#include <stdio.h>
#include <string.h>
#define NM 100001
#define MM 500001
int n,m;
int viz[NM];
int grad[NM];
int st[MM],vf;
struct list{int nod;list *pred,*urm,*mirror;} *g[NM];
inline void add(int x,int y)
{list *p=new list;
p->nod=y;
p->urm=g[x];
if (g[x]) g[x]->pred=p;
g[x]=p;
p->pred=NULL;
list *q=new list;
q->nod=x;
q->urm=g[y];
if (g[y]) g[y]->pred=q;
g[y]=q;
q->pred=NULL;
p->mirror=q;
q->mirror=p;
}
inline void del(list *p,int x)
{if (g[x]==p)
{g[x]=g[x]->urm;
delete p;
return;
}
p->pred->urm=p->urm;
delete p;
}
void df(int);
int main()
{freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d %d",&n,&m);
int i,x,y;
for (i=1;i<=m;i++)
{scanf("%d %d",&x,&y);
add(x,y);
grad[x]++;
grad[y]++;
}
df(1);
for (i=1;i<=n;i++) if (!viz[i]||grad[i]%2==1)
{printf("-1");
return 0;
}
vf=1;
st[vf]=1;
list *p;
int sw;
memset(viz,0,sizeof(viz));
int nr=0;
while (vf)
{x=st[vf];
if (grad[x]==0)
{nr++;
if (nr<=m)
{printf("%d ",x);
}
vf--;
continue;
}
sw=1;
for (p=g[x];p&&sw;p=p->urm)
{grad[x]--;
grad[p->nod]--;
st[++vf]=p->nod;
del(p->mirror,p->nod);
del(p,x);
sw=0;
}
}
return 0;
}
void df(int k)
{viz[k]=1;
list *p;
for (p=g[k];p;p=p->urm)
if (!viz[p->nod])
{df(p->nod);
}
}