Pagini recente » Cod sursa (job #1624851) | Cod sursa (job #2191941) | Cod sursa (job #569698) | Cod sursa (job #1162685) | Cod sursa (job #357372)
Cod sursa(job #357372)
#include<fstream>
using namespace std;
struct lista{int nod;lista *next;} *v[100005],*s=NULL;
int deg[100005],cic[100004],nrcic=0,nr=0,n,m;;
char viz[100005];
void adauga(lista* &l,int x)
{lista *q=new lista;
q->nod=x;
q->next=l;
l=q;
}
void pop(lista* &l,int &x)
{ lista *q=l;
x=q->nod;
l=l->next;
delete q;
}
void sterge(int x,int y)
{lista *q=v[x];
lista *pg=NULL;
while(q)
{if(q->nod==y)
{if(pg) pg->next=q->next;
else v[x]=q->next;
delete q; return; }
pg=q;q=q->next;
}
}
int dfs(int x)
{nr++;
viz[x]=1;
for(lista *p=v[x];p!=NULL;p=p->next)
if(!viz[p->nod])
{viz[p->nod]=1;
dfs(p->nod);}
}
int eulerian()
{dfs(1);
if(n!=nr) return 0;
for(int i=1;i<=n;i++) if(deg[i]%2==1) return 0;
return 1;
}
int euler()
{int x,nd=1;
do
{if(v[nd])
{pop(v[nd],x);
sterge(x,nd);
adauga(s,nd);
nd=x;}
else {cic[++nrcic]=nd;
pop(s,nd);}
}
while(s);
}
int main()
{freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d %d",&n,&m);
int a,b;
for(int i=1;i<=n;i++) {deg[i]=viz[i]=0;v[i]=NULL;}
for(int i=1;i<=m;i++)
{scanf("%d %d",&a,&b); adauga(v[a],b);adauga(v[b],a);deg[a]++;deg[b]++;}
int v=eulerian();
if(v!=1) printf("%d",-1);
else {euler();for(int i=1;i<nrcic;i++) printf("%d ",cic[i]);}
return 0;
}