Cod sursa(job #2374244)

Utilizator herbertoHerbert Mohanu herberto Data 7 martie 2019 17:39:34
Problema Ciclu Eulerian Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100001
#define MAXM 500001

struct edge {
  int dest;
  int ord;
};

bool f[MAXM];
vector<edge>g[MAXN];
vector<int>stiv;
bool verif(int nod){
  int i;
  int ok=0;
  for(i=0; i<g[nod].size(); i++)
    if(f[g[nod][i].ord]==0)
      ok=1;
  return ok;
}
FILE*fout;
void dfs(int nod){
  int st, dr, i;
  stiv.push_back(nod);
  while(!stiv.empty()){
    nod=stiv.back();
    if(verif(nod)==0){
      fprintf(fout, "%d ", nod);
      stiv.pop_back();
    }
    else{
      int ok=1;
      for(i=0; i<g[nod].size() && ok==1; i++){
//        printf("%d %d %d %d\n", nod, g[nod][i].dest, g[nod][i].ord, f[g[nod][i].ord]);
        if(f[g[nod][i].ord]==0){
          ok=0;
          f[g[nod][i].ord]=1;
          stiv.push_back(g[nod][i].dest);
        }
      }
    }
  }
}
int main(){
  FILE*fin=fopen("ciclueuler.in", "r");
  fout=fopen("ciclueuler.out", "w");
  int n, m, i, a, b;
  fscanf(fin, "%d%d", &n, &m);
  for(i=1; i<=m; i++){
    f[i]=0;
    fscanf(fin, "%d%d", &a, &b);
    g[a].push_back({b, i});
    g[b].push_back({a, i});
  }
  int ok=1;
  for(i=1; i<=n; i++)
    if(g[i].size()%2==1)
      ok=0;
  if(ok==0)
    fprintf(fout, "-1");
  else
    dfs(1);
  return 0;
}