Cod sursa(job #3214060)

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

using namespace std;

struct Edge{
  int a, b;
  bool deleted;

public:
  int getOther(int x){
    if(x == a)
      return b;
    return a;
  }
};

vector<vector<int>> v;
int path[MAXM], pathn;
Edge edges[MAXN];
int nre;

int n;

int rep[MAXN];

void euler(int id){
  while(v[id].size() > 0) {
    Edge* next = &edges[v[id][v[id].size() - 1]];
    v[id].pop_back();

    if(!next->deleted){
      next->deleted = true;
      int other = next->getOther(id);
      euler(other);
    }
  }

  path[pathn ++] = id;
}

int main(){
  int m;

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

  for(int i = 0; i < n; i ++)
    rep[i] = 0;

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

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

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

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

  return 0;
}