Pagini recente » Cod sursa (job #2579545) | Cod sursa (job #229068) | Cod sursa (job #1201039) | Cod sursa (job #815921) | Cod sursa (job #271392)
Cod sursa(job #271392)
#include<stdio.h>
#define nmax 100010
#define mmax 500010
long s[mmax], gr[nmax], vz[nmax], n, m;
struct elem
{ long vf;
elem *urm;
} *a[nmax], *q;
FILE *f, *g;
int read()
{ long gr[nmax], i, x, y;
fscanf(f, "%ld%ld", &n, &m);
for(i=1; i<=n; i++)
gr[i]=0;
for(i=1; i<=m; i++)
{ fscanf(f, "%ld%ld", &x, &y);
gr[x]++; gr[y]++;
q=new elem;
q->vf=y; q->urm=a[x];
a[x]=q;
q=new elem;
q->vf=x; q->urm=a[y];
a[y]=q;
}
for(i=1; i<=n; i++)
if(gr[i]%2==1)
return 0;
return 1;
}
void df1(long z, long k)
{ elem *q;
vz[z]=1;
for(q=a[z]; q; q=q->urm)
if(!vz[q->vf])
df1(q->vf, k+1);
}
int check()
{ long i;
df1(1, 1);
for(i=1; i<=n; i++)
if(vz[i]==0)
return 0;
return 1;
}
void del(int x,int y)
{ elem *q, *r, *p;
q=a[x];
a[x]=a[x]->urm;
delete(q);
if(a[y]->vf==x)
{ p=a[y];
a[y]=a[y]->urm;
delete(p);
}
else
for(r=a[y]; r->urm; r=r->urm)
if(r->urm->vf==x)
{ p=r->urm;
r->urm=r->urm->urm;
delete (p);
break;
}
}
void solve()
{ long sol[mmax], x, vf, k=0, i;
vf=1;
s[vf]=1;
while(vf)
{ x=s[vf];
if(a[x]!=NULL)
{ s[++vf]=a[x]->vf;
del(x,a[x]->vf);
}
else sol[++k]=s[vf--];
}
for(i=1; i<k; i++)
fprintf(g, "%d ", sol[i]);
}
int main()
{ f=fopen("ciclueuler.in", "r");
g=fopen("ciclueuler.out", "w");
if(read())
if(check())
solve();
else
fprintf(g, "-1\n");
else
fprintf(g, "-1\n");
fclose(g);
return 0;
}