Cod sursa(job #2770469)

Utilizator euyoTukanul euyo Data 21 august 2021 10:52:53
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#define pb push_back

using namespace std;

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

const int MaxN = 100001;
const int MaxM = 500001;

struct vertex {
  int edge, val;
};

vector<vertex> G[MaxN];
vector<int> cyc, s;

int viz[MaxN];
int eviz[MaxM];

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

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

  fscanf( fin, "%d%d", &n, &m );
  for ( int i = 0; i < m; ++i ) {
    fscanf( fin, "%d%d", &x, &y );
	  G[x].pb({ i, y });
	  G[y].pb({ i, x });
  }
  x = 1;
  while ( x <= n && G[x].size() % 2 == 0 ) {
	  ++x;
  }
  if ( x > n && dfs( 1 ) == n ) {
    s.pb( 1 );
    while ( !s.empty() ) {
      node = s.back();
      while ( G[node].size() && eviz[G[node].back().edge] ) {
        G[node].pop_back();
      }
      if ( G[node].size() == 0 ) {
        cyc.push_back( node );
        s.pop_back();
      } else {
        eviz[G[node].back().edge] = 1;
        s.pb( G[node].back().val );
      }
    }
    for ( int i = 0; i < m; ++i ) {
      fprintf( fout, "%d ", cyc[i] );
	  }
  } else {
    fprintf( fout, "-1" );
  }
  fclose( fin );
  fclose( fout );
  return 0;
}