Cod sursa(job #2928232)

Utilizator teodorescunicolasteodorescu nicolas alexandru teodorescunicolas Data 22 octombrie 2022 15:08:09
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#include <vector>
#include <stack>

#define NMAXX 100000
#define MMAXX 500000

using namespace std;

struct Edge {
    int x, y;
    bool visited;
};

stack<int> cycle;
stack<int> finalCycle;

vector<int> graph[NMAXX];
Edge edges[MMAXX];

int main() {
    FILE *fin, *fout;
    int n, m, x, y, i, node, neighbour;

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

    fscanf( fin, "%d%d", &n, &m );
    for ( i = 0; i < m; i++ ) {
        fscanf( fin, "%d%d", &x, &y );
        edges[i] = {x - 1, y - 1};
        graph[x - 1].push_back( y - 1 );
        graph[y - 1].push_back( x - 1 );
    }

    node = 0;
    while ( node < n && graph[node].size() % 2 == 0 )
        node++;

    if ( node == n ) {
        cycle.push( 0 );
        while ( cycle.size() ) {
            node = cycle.top();

            if ( graph[node].size() ) {
                neighbour = graph[node].back();
                graph[node].pop_back();

                if ( edges[neighbour].visited == 0 ) {
                    cycle.push( neighbour );
                    edges[neighbour].visited = 1;
                }
            } else {
                finalCycle.push( node );
                cycle.pop();
            }
        }

        while ( finalCycle.size() != 0 ) {
            fprintf( fout, "%d ", finalCycle.top() + 1 );
            finalCycle.pop();
        }
    } else
        fprintf( fout, "-1" );

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