Cod sursa(job #3214068)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 13 martie 2024 19:07:10
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 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 = false;

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 degrees[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, n;

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

  nre = 0;
  for(int i = 0; i < m; i ++){
    int a, b;
    fin >> a >> b;
    a --;
    b --;

    v[a].push_back(nre);
    v[b].push_back(nre);
    edges[nre] = {a, b};
    nre ++;

    if(a != b){
      degrees[a] ++;
      degrees[b] ++;
    }
  }
  fin.close();

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

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

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

  return 0;
}