Cod sursa(job #3214062)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 13 martie 2024 19:01:41
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <vector>

#define MAXN 100000
#define MAXM 500000

using namespace std;

struct Edge{
  int a;
  int b;
  int deleted = false;

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

vector<vector<int>> v;
int degrees[MAXN], r[MAXM], ri;
Edge edges[MAXM];

void addEdge(int id, int a, int b){
  edges[id] = {a, b};
  v[a].push_back(id);
  v[b].push_back(id);
}

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);
    }
  }

  r[ri] = id;
  ri ++;
}

int main(){
  int n, m, i, j, a, b, noEdges;

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

  v.resize(n);

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

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

  ofstream fout ("ciclueuler.out");
  i = 0;
  while (i < n && degrees[i] % 2 == 0){
    i ++;
  }
  if(i < n){ // Exista noduri cu grad impar
    fout << "-1" << endl;
  
  } else{
    ri = 0;
    euler(0);
    noEdges = 0;

    for(i = 0; i < ri - 1; i ++)
      fout <<r[i] + 1 << ' ';
    fout << endl;
    fout.close();

  }
  return 0;
}