Pagini recente » Cod sursa (job #688802) | Cod sursa (job #1084201) | Cod sursa (job #1912904) | Cod sursa (job #2725248) | Cod sursa (job #245240)
Cod sursa(job #245240)
#include <stdio.h>
#include <bitset>
using namespace std;
struct per{int x; int y;};
int n,m,i,n1,n2,Q,nod,g[100002],use[100002],st[500002],sol[500005];
bitset <500002>mark;
per a[500002];
int *v[500002];
int main(){
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d %d",&n,&m);
for (i=1;i<=m;++i){
scanf("%d %d\n",&a[i].x,&a[i].y);
g[a[i].x]++; g[a[i].y]++;
}
for (i=1;i<=n;++i)if ((g[i]&1)){printf("-1\n");return 0;}//nu exista sol
for (i=1;i<=n;++i)v[i]=(int*)malloc(g[i]*sizeof(int)),g[i]=0;
for (i=1;i<=m;++i){
n1=a[i].x;n2=a[i].y;
v[n1][g[n1]++]=i; v[n2][g[n2]++]=i;
}
Q=1;st[1]=1;m=0;
while (Q){
nod=st[Q];
while ( use[nod]<g[nod] && mark[v[nod][use[nod]]] )use[nod]++;
if (use[nod]<g[nod]){
mark[v[nod][use[nod]]]=1;
if ( nod == a[v[nod][use[nod]]].x ) st[++Q]=a[v[nod][use[nod]]].y;
else st[++Q]=a[v[nod][use[nod]]].x;
use[nod]++;
}
else sol[++m]=st[Q],--Q;
}
for (i=1;i<m;++i)printf("%ld ",sol[i]);
printf("\n");
return 0;
}