Cod sursa(job #2928456)

Utilizator teochess2017Togan Teodor-Bogdan teochess2017 Data 22 octombrie 2022 22:45:05
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.35 kb
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

#define MAXN 100000
#define MAXM 500000

struct muchii{
  int nod, nrap;
};

vector <muchii> graf[MAXN];
int nrmuchii[MAXN], out[MAXM];

int cautare(int node, int w){
  int mi, ma, mij;
  mi = 0;
  ma = graf[node].size();
  while((ma - mi) > 1){
    mij = (mi + ma) / 2;
    if(w < graf[node][mij].nod){
      ma = mij;
    }else{
      mi = mij;
    }
  }
  return mi;
}
void stergere(int node, int w){
  int cautat;
  graf[node][graf[node].size() - 1].nrap--;
  if(graf[node][graf[node].size() - 1].nrap == 0){
    graf[node].pop_back();
  }
  cautat = cautare(w, node);
  graf[w][cautat].nrap--;
}
void euler(int node, int &ind){
  int w;
  while(!graf[node].empty()){
    w = graf[node][graf[node].size() - 1].nod;
    if(0 < graf[node][graf[node].size() - 1].nrap){
      stergere(node, w);
      euler(w, ind);
    }else{
      graf[node].pop_back();
    }
  }
  out[ind] = node;
  ind++;
}
bool cmp(muchii a, muchii b){
  if(a.nod < b.nod){
    return true;
  }else{
    return false;
  }
}

int main()
{
    FILE *fin, *fout;
    int n, m, i, j, a, b, f, ind;
    fin = fopen("ciclueuler.in", "r");
    fscanf(fin, "%d%d", &n, &m);
    for(i = 0; i < m; i++){
      fscanf(fin, "%d%d", &a, &b);
      graf[a - 1].push_back({b - 1, 1});
      graf[b - 1].push_back({a - 1, 1});
      nrmuchii[a - 1]++;
      nrmuchii[b - 1]++;
    }
    fclose(fin);
    f = 0;
    for(i = 0; i < n; i++){
      if((nrmuchii[i] % 2) == 1){
        f = -1;
      }
      sort(graf[i].begin(), graf[i].begin() + graf[i].size(), cmp);
      ind = 0;
      for(j = 1; j < graf[i].size(); j++){
        if(graf[i][j].nod != graf[i][j - 1].nod){
          graf[i][ind].nod = graf[i][j - 1].nod;
          ind++;
          graf[i][ind].nrap = 1;
        }else{
          graf[i][ind].nrap++;
        }
      }
      graf[i][ind].nod = graf[i][j - 1].nod;
      ind++;
      while(ind < graf[i].size()){
        graf[i].pop_back();
      }
    }
    fout = fopen("ciclueuler.out", "w");
    if(f == -1){
      fprintf(fout, "-1");
    }else{
      ind = 0;
      euler(0, ind);
      for(ind = ind - 1; 0 < ind; ind--){
        fprintf(fout, "%d ", out[ind] + 1);
      }
    }
    fclose(fout);
    return 0;
}