Cod sursa(job #821561)
#include<iostream>
#include<fstream>
using namespace std;
#define NMAX 100001
struct nod {
int info;
nod *urm;
};
typedef nod* PNOD;
ofstream g("ciclueuler.out");
PNOD prim[NMAX];
int viz[NMAX],gr[NMAX],n;
void adauga(PNOD p, int y)
{
PNOD aux;
aux=new nod;
aux->info=y;
aux->urm=p->urm;
p->urm=aux;
}
void sterge(PNOD p)
{
PNOD aux;
aux=p->urm;
p->urm=aux->urm;
delete aux;
}
PNOD cauta(PNOD p, int x)
{
while(p->urm->info!=x)
p=p->urm;
return p;
}
void citire()
{
int m,x,y,i;
ifstream f("ciclueuler.in");
f>>n>>m;
for(i=1;i<=n;i++) {
prim[i]=new nod;
prim[i]->urm=NULL;
}
for(i=1;i<=m;i++) {
f>>x>>y;
gr[x]++;
gr[y]++;
adauga(prim[x],y);
adauga(prim[y],x);
}
f.close();
}
void euler(int nod, bool opt)
{
int x;
for(PNOD p=prim[nod];p->urm!=NULL; ) {
x=p->urm->info;
sterge(p);
sterge(cauta(prim[x],nod));
euler(x,true);
}
if(opt==true)
g<<nod<<" ";
}
void dfs(int nod)
{
viz[nod]=1;
for(PNOD p=prim[nod]->urm;p!=NULL;p=p->urm)
if(viz[p->info]==0)
dfs(p->info);
}
int main()
{
int i;
citire();
dfs(1);
for(i=1;i<=n;i++)
if(viz[i]==0 || gr[i]%2==1)
break;
if(i>n)
euler(1,false);
else g<<"-1";
g.close();
return 0;
}