Cod sursa(job #2928036)

Utilizator mircea_007Mircea Rebengiuc mircea_007 Data 22 octombrie 2022 00:50:37
Problema Ciclu Eulerian Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
// This program was written
// by Mircea Rebengiuc
// for problem https://infoarena.ro/problema/ciclueuler
// on 21.10.2022

// varianta iterativa

#include <stdio.h>
#include <ctype.h>

#include <vector>

#define magic_sauce inline __attribute__((always_inline))

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

int e[MAXM];
int viz[MAXM];
std::vector<int> adj[MAXM]; // lista de muchii

int ciclu[1 + MAXM];

int stack[MAX_STACK];
int idx[MAX_STACK];

FILE *fin, *fout;

magic_sauce int fgetint(){
  int n = 0, ch;

  while( !isdigit( ch = fgetc( fin ) ) );
  do
    n = n * 10 + ch - '0';
  while( isdigit( ch = fgetc( fin ) ) );

  return n;
}

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

  int n, m, i, u, v, spar, sp, ncic;

  n = fgetint();
  m = fgetint();
  for( i = 0 ; i < m ; i++ ){
    u = fgetint() - 1;
    v = fgetint() - 1;

    e[i] = (u ^ v);
    adj[u].push_back( i );
    adj[v].push_back( i );
  }

  spar = 0;
  for( i = 0 ; i < n ; i++ )
    spar += (adj[i].size() & 1);

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

  idx[0] = 0;
  stack[0] = 0;
  sp = 1;
  ncic = 0;
  
  while( sp ){
    u = stack[sp - 1];

    if( idx[sp - 1] >= (int)adj[u].size() ){
      ciclu[ncic++] = u;
      sp--; // return
    }else{
      v = adj[u][idx[sp - 1]];
      idx[sp - 1]++;
      if( !viz[v] ){
        viz[v] = 1;
        v = (e[v] ^ u);
        idx[sp] = 0;
        stack[sp++] = v;
      }
    }
  }

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

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