Pagini recente » Cod sursa (job #2186500) | Cod sursa (job #2350554) | Cod sursa (job #1844914) | Cod sursa (job #3204354) | Cod sursa (job #1854551)
#include <fstream>
#include <iostream>
#include <cstring>
#define hash_constant 982451653
#define scope 1000000
//982 451 653
using namespace std;
fstream f("ciclueuler.in",ios::in),g("ciclueuler.out",ios::out);
struct nod
{
nod *next,*prev,*twin;
int dest;
}*v[1000001],*p,*q,*sol,*prez,*d[1000001];
int i,j,n,m,card[1000001],a,b,t,l;
nod* add(nod *p)
{
nod *q=new nod;
q->prev=p->prev;
q->next=p;
p->prev->next=q;
p->prev=q;
return q;
}
nod* del(nod *a)
{
a->prev->next=a->next;
a->next->prev=a->prev;
delete a;
return NULL;
}
void rev(nod *p)
{
int i=p->dest;
int j=i,k;
p=p->next;
nod *q,*r;
while(card[i]>0)
{
k=v[j]->next->dest;
card[j]--;card[k]--;
q=v[j]->next;
r=q->twin;
del(q);
del(r);
if(card[j]==0&&d[j]!=NULL)d[j]=del(d[j]);
if(card[k]==0&&d[k]!=NULL)d[k]=del(d[k]);
q=add(p);
q->dest=k;
if(card[k]>0)
{
if(d[k]==NULL){d[k]=add(prez);d[k]->dest=k;}
d[k]->twin=q;
}
j=k;
}
}
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
{
v[i]=new nod;
v[i]->next=v[i]->prev=v[i];
v[i]->twin=NULL;
v[i]->dest=0;
d[i]=NULL;
}
for(i=0;i<m;i++)
{
f>>a>>b;
card[a]++;card[b]++;
p=add(v[a]);
q=add(v[b]);
p->dest=b;
q->dest=a;
p->twin=q;
q->twin=p;
}
for(i=1,t=1;i<=n;i++)if(card[i]%2==1)t=0;
if(t==0){g<<-1;return 0;}
sol=new nod;
sol->next=sol->prev=sol;
sol->twin=NULL;
sol->dest=0;
prez=new nod;
prez->next=prez->prev=prez;
prez->twin=NULL;
prez->dest=0;
p=add(sol);
p->dest=1;
if(card[1]>0)
{
q=add(prez);
q->dest=1;
d[1]=q;
q->twin=p;
}
while(prez->next!=prez)rev(prez->next->twin);
for(p=sol->next;p!=sol->prev;p=p->next)g<<p->dest<<' ';
}