Cod sursa(job #3289194)

Utilizator pacelaaaCiurea Pavel pacelaaa Data 26 martie 2025 00:38:43
Problema Ciclu Eulerian Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>

using namespace std;

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

#define cin fin
#define cout fout


#define PB push_back
#define F first
#define S second

const int Nmax = 1e5 + 1;

typedef pair<int, int> pii;

int deg[Nmax];
vector<int> lista, cycle;
unordered_multiset<int> adj[Nmax];

void build_cycle() {
  cycle.PB( 1 );
  int u = *adj[1].begin();

  adj[1].erase( adj[1].begin() );
  auto it = adj[u].find( 1 );
  adj[u].erase( it );
  while( u != 1 ) {
    cycle.PB( u );
    int v = *adj[u].begin();

    adj[u].erase( adj[u].begin() );
    it = adj[v].find( u );
    adj[v].erase( it );

    u = v;
  }
}

void next_vertex( int nod ) {
  int u;

  while( !adj[nod].empty() ) {
    u = *adj[nod].begin();

    cout << u << " ";
    auto it = adj[u].find( nod );
    adj[u].erase( it );
    adj[nod].erase( adj[nod].begin() );

    next_vertex( u );
  }
}

int main()
{
    int n, m, i, u, v, nod, last;
    bool exista;

    cin >> n >> m;
    for( i = 0; i < m; i ++ ) {
      cin >> u >> v;

      adj[u].insert( v );
      adj[v].insert( u );

      deg[u]++;
      deg[v]++;
    }

    exista = true;
    for( i = 1; i < n + 1; i ++ )
      if( deg[i] % 2 != 0 )
        exista = false;

    if( !exista )
      cout << -1 << '\n';
    else {
      build_cycle();
      for( i = 0; i < cycle.size(); i ++ ) {
        cout << cycle[i] << " ";
        next_vertex( cycle[i] );
      }
    }
    return 0;
}