Cod sursa(job #1897453)

Utilizator stoianmihailStoian Mihail stoianmihail Data 1 martie 2017 14:04:59
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>

#define MAX_N 100000
#define MAX_M 500000
#define NIL -1

typedef struct {
  int v, next;
} list;

int N, M, buff;
int adj[MAX_N + 1];
list l[2 * MAX_M + 1];
int stack[MAX_N + 1];
int inside[MAX_N + 1];

void addEdge(int u, int v) {
  buff++;
  inside[u]++;
  l[buff].v = v;
  l[buff].next = adj[u];
  adj[u] = buff;
}

int check(int pos, int u) {
  if (l[pos - 1].v == u) {
    return pos - 1;
  }
  return pos + 1;
}

void euler(int u) {
  int ss = 0, pos;
  stack[ss++] = u;
  while (ss) {
    u = stack[ss - 1];
    if (inside[u] == 0) {
      ss--;
      if (ss) {
        fprintf(stdout, "%d ", u);
      }
    } else {
      pos = adj[u];
      adj[u] = l[pos].next;
      if (l[pos].v != NIL) {
        if (u > l[pos].v) {
          inside[l[pos + 1].v]--;
          l[pos + 1].v = NIL;
        } else {
          inside[l[pos - 1].v]--;
          l[pos - 1].v = NIL;
        }
        stack[ss++] = l[pos].v;
        l[pos].v = NIL;
        inside[u]--;
      }
    }
  }
}

int main(void) {
  int i, u, v;
  FILE *f = fopen("ciclueuler.in", "r");

  fscanf(f, "%d %d", &N, &M);
  for (i = 1; i <= M; i++) {
    fscanf(f, "%d %d", &u, &v);
    if (u > v) {
      addEdge(u, v);
      addEdge(v, u);
    } else {
      addEdge(v, u);
      addEdge(u, v);
    }
  }
  fclose(f);

  u = 1;
  while (u <= N && inside[u] % 2 == 0) {
    u++;
  }

  freopen("ciclueuler.out", "w", stdout);
  if (u <= N) {
    fprintf(stdout, "%d\n", NIL);
  } else {
    euler(1);
  }
  fclose(stdout);
  return 0;
}