Pagini recente » Diferente pentru utilizator/mihaelacismaru intre reviziile 62 si 63 | Monitorul de evaluare | Cod sursa (job #2014912) | Profil mateisirghe | Cod sursa (job #418745)
Cod sursa(job #418745)
#include<cstdio>
#include<iostream>
using namespace std;
struct nod
{
int info;
nod *next;
};
#define nn 100005
nod *g[nn];
int e[nn],n,m,grad[nn],v[nn];
void adauga(int a,int b)
{
if(!g[a])
{
g[a]=new nod;
g[a]->info=b;
g[a]->next=NULL;
}
else
{
nod *p=g[a];
while(p&&p->next)p=p->next;
nod *q=new nod;
p->next=q;
q->info=b;
q->next=NULL;
}
}
void sterg(int k,int kk)
{
--grad[k];
--grad[kk];
int pp=1;
if(g[k]&&g[k]->next)
for(nod *p=g[k],*q=p->next;p&&q&&pp;)
if(q->info==kk)
{
p->next=q->next;
delete q;
q=p->next;
pp=0;
}
else
p=p->next,q=q->next;
if(g[k]->info==kk)
{
nod *p=g[k];
g[k]=g[k]->next;
delete p;
}
}
void euler(int k)
{
while(g[k])
{
int kk=g[k]->info;
sterg(k,kk);
euler(kk);
}
e[++m]=k;
}
void bfs()
{
int coada[nn],st,dr;
coada[1]=1;
st=dr=1;
v[1]=1;
while(st<=dr)
{
for(nod *p=g[coada[st]];p;p=p->next)
if(!v[p->info])
{
v[p->info]=1;
coada[++dr]=p->info;
}
++st;
}
}
int posibil()
{
bfs();
int pp=1;
for(int i=1;i<=n&&pp;++i)
if(!v[i]||grad[i]%2)
pp=0;
if(!pp)return 0;
return 1;
}
int main()
{
int a,b;
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&n,&m);
for(;m;--m)
{
scanf("%d%d",&a,&b);
adauga(a,b);
++grad[a];
}
/*for(int i=1;i<=n;++i)
{
for(nod *p=g[i];p;p=p->next)
printf("%d ",p->info);
printf("\n");
}*/
if(posibil())
euler(1);
if(m)
for(int i=1;i<=m;++i)
printf("%d ",e[i]);
else
printf("-1");
return 0;
}