Cod sursa(job #2681388)

Utilizator euyoTukanul euyo Data 5 decembrie 2020 12:43:01
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <algorithm>
#include <stack>
#include <vector>

using namespace std;

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

const int MaxN = 100001;

vector<int> G[MaxN];
vector<int> cyc;
stack<int> s;

int deg[MaxN];
int vis[MaxN];

static inline void delEdge( int x, int y ) { 
  int i = 0;

  G[y].pop_back();
  while ( G[x][i] != y ) {
    ++i;
  }
  swap( G[x][i], G[x].back() );
  G[x].pop_back();
}

int DFS( int node ) {
  int num = 1;
  vis[node] = 1;
  for ( int i = 0; i < G[node].size(); ++i ) {
	if ( !vis[G[node][i]] ) {
	  num += DFS( G[node][i] );
	}
  }
  return num;
}

int main() {
  int n, m, x, y, node;

  fin >> n >> m;
  for ( int i = 0; i < m; ++i ) {
	fin >> x >> y;
    G[x].push_back( y );
	G[y].push_back( x );
    ++deg[x];
	++deg[y];
  }
  node = 1;
  while ( node <= n && !(deg[node] & 1) ) {
	++node;
  }
  if ( node > n && DFS( 1 ) == n ) {
    s.push( 1 );
    while ( !s.empty() ) {
      node = s.top();
	  if ( G[node].size() == 0 ) {
	    cyc.push_back( node );
	    s.pop();
	  } else {
	    s.push( G[node].back() );
	    delEdge( G[node].back(), node );
	  }
    }
    for ( int i = 0; i < m; ++i ) {
	  fout << cyc[i] << " ";
    }
  } else {
	fout << "-1\n";
  }
  fin.close();
  fout.close();
  return 0;
}