Cod sursa(job #3214048)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 13 martie 2024 18:42:38
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MAXN 100000
#define MAXM 500000
#define DEBUG 0

using namespace std;

struct Edge{
  int a, b;
};

vector<vector<int>> v;
vector<int> path;
vector<Edge> edges;

int n;

int rep[MAXN];

void hierholzer(int id){
  if(DEBUG){
    printf("Node: %d\n", id + 1);
    for(int j = 0; j < n; j ++){
      printf("%d: ", j + 1);
      if(!v[j].empty()){
        for(int i = 0; i < v[j].size(); i ++){
          if(edges[v[j][i]].a != -1)
            printf("(%d, %d) ", edges[v[j][i]].a + 1, edges[v[j][i]].b + 1);
        }
      }
      printf("\n");
    }
    printf("\n");
    fflush(NULL);
  }

  while(!v[id].empty()) {
    int eid = v[id][v[id].size() - 1];
    if(edges[eid].a != -1){
      int other;
      if(edges[eid].b == id)
        other = edges[eid].a;
      else
        other = edges[eid].b;

      edges[eid] = {-1, -1};
      hierholzer(other);
    }

    if(!v[id].empty())
      v[id].pop_back();
  }
  path.push_back(id);
}

int main(){
  int m;

  ifstream fin ("euler.in");
  fin >> n >> m;
  v.resize(n);

  for(int i = 0; i < m; i ++){
    int a, b;
    fin >> a >> b;
    a --;
    b --;
    if(a != b){
      v[a].push_back(edges.size());
      v[b].push_back(edges.size());
      edges.push_back({a, b});
    } else
      rep[a] ++;
  }
  fin.close();

  int nr = 0, last = 0;
  for(int i = 0; i < n; i ++){
    if(v[i].size() % 2 == 1){
      nr ++;
      last = i;
    }
  }

  ofstream fout ("euler.out");
  if(nr > 2){
    fout << "-1" << endl;
    fout.close();
    return 0;
  }

  hierholzer(last);
  for(int i = path.size() - 1; i > 0; i --){
    while(rep[path[i]] > 0){
      fout << path[i] + 1 << ' ';
      rep[path[i]] --;
    }
    fout << path[i] + 1 << ' ';
  }
  fout.close();

  return 0;
}