Cod sursa(job #2928242)

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

#define NMAXX 100000
#define MMAXX 500000

using namespace std;

struct Edge {
    int x, y;
    bool visited;

    int getN( int node ) {
        return x == node ? y : x;
    }
};

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( i );
        graph[y - 1].push_back( i );
    }

    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( edges[neighbour].getN( node ) );
                    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;
}