Pagini recente » Cod sursa (job #2531867) | Cod sursa (job #1376780) | Cod sursa (job #348944) | Cod sursa (job #1292909) | Cod sursa (job #1232689)
#include <cstdio>
using namespace std;
struct cel
{
int urm,inf;
cel *adr;
};
typedef cel *lda1;
lda1 lda[100005];
int n,m,a,b,sol[500005],lista[500005],grad[100005],trecut[100005],scos[500005];
void parc(int nod)
{
trecut[nod]=1;
for (lda1 p=lda[nod];p!=0;p=p->adr)
{
if (trecut[p->urm]==0)
{
parc(p->urm);
}
}
}
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d %d",&n,&m);
for (int i=1;i<=m;++i)
{
scanf("%d %d",&a,&b);
grad[a]++; grad[b]++;
lda1 p=new cel;
p->urm=b;
p->inf=i;
p->adr=lda[a];
lda[a]=p;
p=new cel;
p->urm=a;
p->inf=i;
p->adr=lda[b];
lda[b]=p;
}
int advr=1;
parc(1);
for (int i=1;i<=n;++i) if (trecut[i]==0) advr=0;
for (int i=1;i<=n;++i) if (grad[i]&1==1) advr=0;
if (advr==1)
{
lista[0]=1; lista[1]=1;
while (lista[0]>0)
{
int i=lista[lista[0]];
if (grad[i]==0)
{
++sol[0]; sol[sol[0]]=i; --lista[0];
}else
{
while (scos[lda[i]->inf]==1)
{
lda1 p=lda[i];
lda[i]=lda[i]->adr;
delete(p);
}
++lista[0]; lista[lista[0]]=lda[i]->urm;
--grad[i];
--grad[lda[i]->urm];
scos[lda[i]->inf]=1;
lda1 p=lda[i];
lda[i]=lda[i]->adr;
delete(p);
}
}
for (int i=1;i<=m;++i) printf("%d ",sol[i]);
}else printf("-1");
fclose(stdin);
fclose(stdout);
return 0;
}