Pagini recente » Cod sursa (job #125978) | Cod sursa (job #2200325) | Cod sursa (job #856689) | Cod sursa (job #403543) | Cod sursa (job #394436)
Cod sursa(job #394436)
using namespace std;
#include<fstream>
ofstream fout("ciclueuler.out");
struct nod
{
int vf;
nod* next;
};
int n,m,*v,*d,*coada,solutie=1,dr;
nod* G[100003];
void addarc(int,int);
void euler(int);
void sterge(int,int);
int main()
{
nod *p;
int i,x,y;
ifstream fin("ciclueuler.in");
fin>>n>>m;
d=new int[n+1];
for(i=1;i<=n;++i)
d[i]=0;
for(i=1;i<=m;++i)
{
fin>>x>>y;
addarc(x,y);
addarc(y,x);
++d[x];
++d[y];
}
for(i=1;i<=n;++i)
if(d[i]%2)
{
solutie=0;
break;
}
if(solutie)
{
v=new int[n+1];
for(i=1;i<=n;++i)
v[i]=0;
x=y=1;
coada=new int[n+m];
coada[x]=1;
v[1]=1;
while(x<=y)
{
for(p=G[coada[x]];p;p=p->next)
if(v[p->vf]==0)
{
coada[++y]=p->vf;
v[p->vf]=1;
}
++x;
}
for(i=1;i<=n;++i)
if(v[i]==0)
{
solutie=0;
break;
}
}
if(solutie)
{
euler(1);
for(i=1;i<dr;++i)
fout<<coada[i]<<' ';
}
else
fout<<-1;
return 0;
}
void addarc(int i,int j)
{
nod *p=new nod;
p->vf=j;
p->next=G[i];
G[i]=p;
}
void euler(int i)
{
int x;
nod *p;
p=G[i];
while(p)
{
if(p->vf!=-1)
{
x=p->vf;
sterge(i,p->vf);
euler(x);
}
p=p->next;
}
coada[++dr]=i;
}
void sterge(int i,int j)
{
nod *p;
for(p=G[i];p;p=p->next)
if(p->vf==j)
{
p->vf=-1;
break;
}
for(p=G[j];p;p=p->next)
if(p->vf==i)
{
p->vf=-1;
break;
}
}