Cod sursa(job #2926845)

Utilizator iraresmihaiiordache rares mihai iraresmihai Data 18 octombrie 2022 20:11:05
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <vector>
#include <stack>

#define MAXN 100000
#define MAXM 500000
using namespace std;

struct edge{
  int id, a, b;
  int other(int n) {
    return a + b - n;
  }
};

struct node{
  vector <edge> edges;
};

vector <int> s;
stack <int> nodes;

node graph[MAXN];
bool visitedEdge[MAXM];
int visitedEdgeSize;

void bfs(int pos) {
  int i;

  nodes.push(pos);
  while ( !nodes.empty() ) {
    i = nodes.top();

    while ( !graph[i].edges.empty() && visitedEdge[graph[i].edges[graph[i].edges.size() - 1].id] ) {
      graph[i].edges.pop_back();
    }

    if ( !graph[i].edges.empty() ) {
      nodes.push(graph[i].edges[graph[i].edges.size() - 1].other(i));
      visitedEdge[graph[i].edges[graph[i].edges.size() - 1].id] = true;
      //s.push_back(i); la curs am gresit cand am spus ca trb pusa si asta
      graph[i].edges.pop_back();
    } else {
      s.push_back(i);
      nodes.pop();
    }
  }
}

void addEdge(int a, int b) {
  graph[a].edges.push_back({visitedEdgeSize, a, b});
  graph[b].edges.push_back({visitedEdgeSize, a, b});
  visitedEdgeSize++;
}

int main() {
  FILE *fin, *fout;
  fin = fopen("ciclueuler.in", "r");
  fout = fopen("ciclueuler.out", "w");

  int n, m, a, b, i;

  fscanf(fin, "%d%d", &n, &m);

  while ( m-- ) {
    fscanf(fin, "%d%d", &a, &b);
    a--;
    b--;

    addEdge(a, b);
  }

  i = 0;
  while ( i < n && graph[i].edges.size() % 2 == 0 ) {
    i++;
  }

  if ( i == n ) {
    i = 0;
    while ( i < n && !graph[i].edges.size() ) {
      i++;
    }
    if ( i < n ) {
      bfs(i);
    }

    i = 0;
    while ( i < visitedEdgeSize && visitedEdge[i] ) {
      i++;
    }

    if ( i == visitedEdgeSize ) {
      for ( i = 0; i < s.size() - 1; i++ ) {
        fprintf(fout, "%d ", s[i] + 1);
      }
    } else {
      fprintf(fout, "-1");
    }
  } else {
    fprintf(fout, "-1\n");
  }

  fclose(fin);
  fclose(fout);

  return 0;
}