Cod sursa(job #2477431)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 20 octombrie 2019 12:46:40
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <vector>
#include <cstring>

#define DIM 100000 + 1

using namespace std;

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

vector < pair < int, int > > graph[DIM];
int gr[DIM], cicle[5 * DIM], euler[5 * DIM], start[DIM];
bool viz[5 * DIM];

void modif ( int node, int new_node, int number_arc ){
    gr[node]--, gr[new_node]--, viz[number_arc] = 1;
}

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