Cod sursa(job #2572362)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 5 martie 2020 12:36:03
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <vector>

#define N 100001

using namespace std;

ifstream f ( "ciclueuler.in" );
ofstream g ( "ciclueuler.out" );

vector < pair < int, int > > graph[N];
int start[N], cicle[N], euler[N], n, m, x, y, k, p, i, gr[N], nr;
bool viz[N];

int main()
{   f >> n >> m;
    for ( i = 1; i <= m; i++ ){
        f >> x >> y;
        graph[x].push_back ( { y, i } );
        graph[y].push_back ( { x, i } );
        gr[x]++, gr[y]++;
    }
    cicle[k = 1] = 1;
    for ( i = 1; i <= n; i++ )
        if ( gr[i] % 2 == 1 )
            nr++;
    if ( nr > 2 ){
        g << -1;
        return 0;
    }
    while ( k != 0 ){
        while ( gr[cicle[k]] == 0 && k > 0 ){
            euler[++p] = cicle[k];
            k--;
        }
        if ( k > 0 ){
            int node = cicle[k];
            while ( start[node] < graph[node].size ( ) ){
                int new_node = graph[node][start[node]].first;
                int arc_num = graph[node][start[node]].second;
                if ( viz[arc_num] == 0 ){
                    cicle[++k] = new_node;
                    viz[arc_num] = 1;
                    gr[node]--, gr[new_node]--;
                    break;
                }
                start[node]++;
            }
        }
    }
    if ( p == m + 1 )
        for ( i = 1; i <= p; i++ )
            g << euler[i] << ' ';
    else
        g << -1;
    return 0;
}