Pagini recente » Cod sursa (job #2426961) | Cod sursa (job #2790618) | Cod sursa (job #903029) | Cod sursa (job #1153917) | Cod sursa (job #2928036)
// 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;
}