Cod sursa(job #245240)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 17 ianuarie 2009 14:08:34
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#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;
}