Pagini recente » Cod sursa (job #2877358) | Cod sursa (job #3214534) | Cod sursa (job #3214924) | Cod sursa (job #506661) | Cod sursa (job #632137)
Cod sursa(job #632137)
#include <stdio.h>
#define nMax 100100
using namespace std;
int n;
int m;
int grad[nMax];
struct nod{
int x;
nod *urm;
}*a[nMax];
int sol[nMax];
int solMare[nMax];
int nSol;
int nSolMare;
void citire()
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
int x;
int y;
scanf("%d%d",&x,&y);
grad[x]++;
grad[y]++;
nod *g;
g = new nod;
g -> x = x;
g -> urm = a[y];
a[y] = g;
nod *h;
h = new nod;
h -> x = y;
h -> urm = a[x];
}
}
void funct()
{
if(!nSolMare)
{
for(int i=0;i<nSol;i++)
solMare[i]=sol[i];
nSolMare=nSol;
nSol=0;
return;
}
for(int i=0;i<n;i++)
{
if(solMare[i]==sol[0])
{
for(int j=nSol-1;j>i;j--)
solMare[j]=solMare[j-nSol+1];
for(int k=1;k<nSol;k++,i++)
{
solMare[i]=sol[k];
}
nSolMare=nSol;
nSol=0;
return;
}
}
}
void sterge(int x, int y)
{
if(a[x]->x == y)
{
a[x]=a[x]->urm;
return;
}
for(nod *i=a[x]; i->urm; i=i->urm)
{
if(i->urm->x==y)
{
i->urm=i->urm->urm;
}
}
}
void macaroane(int k)
{
while(a[k])
{
if(nSol==0)
{
sol[nSol++]=k;
continue;
}
else
if(a[k] -> x == sol[0])
{
funct();
}else
{
sol[nSol++]=a[k]->x;
nod *x=a[k];
a[k]=a[k]->urm;
sterge(x->x,k);
delete x;
macaroane(a[k] -> x);
}
}
}
void rez()
{
for(int i=0;i<=n;i++)
{
if(grad[i]!=0)
{
sol[nSol++]=i;
macaroane(i);
return;
}
}
}
int main()
{
freopen("ciclueuler.in","r",stdin);
//freopen("cilcueuler.out","w",stout);
citire();
for(int i=0;i<=n;i++)
{
if(grad[i]%2==1)
{
printf("-1");
return 0;
}
}
rez();
for(int i=0;i<nSolMare;i++)
printf("%d ",solMare[i]);
return 0;
}