Cod sursa(job #3147308)

Utilizator mircea_007Mircea Rebengiuc mircea_007 Data 25 august 2023 15:35:01
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <stdio.h>

#include <vector>

const int MAXN = 1e5;
const int MAXM = 5e5;

std::vector<int> edges[MAXN];

int node_sum[MAXM];
bool viz[MAXM];

int ncyc;
int cycle[1 + MAXM];

int stack[MAXM];
int sp;

int edge_position[MAXN];

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

  int n, m, i, a, b, parity_check;

  fscanf( fin, "%d%d", &n, &m );
  for( i = 0 ; i < m ; i++ ){
    fscanf( fin, "%d%d", &a, &b );
    a--;
    b--;

    node_sum[i] = a + b;
    viz[i] = false;
    edges[a].push_back( i );
    edges[b].push_back( i );
  }

  parity_check = true;
  for( i = 0 ; i < n ; i++ ){
    edge_position[i] = 0;
    if( ((int)edges[i].size()) & 1 )
      parity_check = false;
  }

  if( !parity_check ){
    fputs( "-1\n", fout );
    fclose( fin );
    fclose( fout );
    return 0;
  }

  ncyc = 0;
  sp = 1;
  stack[0] = 0;
  while( sp ){
    a = stack[sp - 1];

    if( edge_position[a] < (int)edges[a].size() ){
      b = edges[a][edge_position[a]++];

      if( !viz[b] ){
        viz[b] = true;
        stack[sp++] = node_sum[b] - a;
      }
    }else{
      cycle[ncyc++] = a;

      sp--; // return
    }
  }

  for( i = 1 ; i < ncyc ; i++ )
    fprintf( fout, "%d ", 1 + cycle[i] );
  fputc( '\n', fout );

  fclose( fin );
  fclose( fout );
  return 0;
}