Cod sursa(job #2531839)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 26 ianuarie 2020 19:50:16
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

const int NMAX = 100005, MMAX = 500005;

vector<int> G[NMAX];
bool usedEdge[MMAX];
int from[NMAX], to[NMAX];

int main() {
    int n, m;
    fin>>n>>m;
    for( int i = 0; i < m; i ++ ) {
      int x, y;
      fin>>x>>y;
      G[x].push_back(i);
      G[y].push_back(i);
      from[i] = x;
      to[i] = y;
    }

    for( int i = 1; i <= n; i ++ ) {
      if( G[i].size() % 2 == 1 ) {
        fout<<"-1";
        return 0;
      }
    }

    vector<int> ans;
    vector<int> st; //simulez apelul recursiv fml
    st.push_back(1);
    while( !st.empty() ) {
      int node = st.back();
      if( !G[node].empty() ) {
        int i = G[node].back();
        G[node].pop_back();
        if( !usedEdge[i] ) {
          usedEdge[i] = true;
          int to = ::from[i] ^ ::to[i] ^ node;
          st.push_back(to);
        }
      }
      else {
        st.pop_back();
        ans.push_back(node);
      }
    }

    for( const auto &it : ans )
      fout<<it<<" ";
    return 0;
}