Cod sursa(job #2691901)

Utilizator euyoTukanul euyo Data 30 decembrie 2020 17:22:44
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <cstdio>
#include <algorithm>
#include <cctype>
#include <stack>
#include <vector>

using namespace std;

FILE *fin = fopen( "ciclueuler.in", "r" );
FILE *fout = fopen( "ciclueuler.out", "w" );

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 < (int)G[node].size(); ++i ) {
	if ( !vis[G[node][i]] ) {
	  num += DFS( G[node][i] );
	}
  }
  return num;
}

int getNum() {
  int n = 0;
  char ch;
  while ( isspace( ch = fgetc( fin ) ) );
  do {
    n = n * 10 + ch - '0';
  } while ( isdigit( ch = fgetc( fin ) ) );
  return n;
}
void giveNum( int n ) {
  int m = n, p = 10;
 
  while ( m > 9 ) {
	p *= 10;
	m /= 10;
  }
  p /= 10;
  while ( p > 0 ) {
	fputc( n / p + '0', fout );
	n %= p;
	p /= 10;
  }
  fputc( ' ', fout );
}

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

  n = getNum();
  m = getNum();
  for ( int i = 0; i < m; ++i ) {
    x = getNum();
	y = getNum();
	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 ) {
      giveNum( cyc[i] );
	}
  } else {
    fputc( '-', fout );
	fputc( '1', fout );
  }
  fclose( fin );
  fclose( fout );
  return 0;
}