Cod sursa(job #2572391)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 5 martie 2020 12:40:52
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 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 ){
        if ( gr[cicle[k]] == 0 ){
            euler[++p] = cicle[k];
            k--;
        }
        int node = cicle[k];
        for ( start[node]; start[node] < graph[node].size ( ); start[node]++ ){
            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]--;
                start[node]++;
                break;
            }
        }
    }
    if ( p == m + 1 )
        for ( i = 1; i <= p; i++ )
            g << euler[i] << ' ';
    else
        g << -1;
    return 0;
}