Cod sursa(job #2477426)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 20 octombrie 2019 12:43:00
Problema Ciclu Eulerian Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 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[3 * DIM], euler[3 * 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 ){
        if ( gr[ cicle[k] ] == 0 ){
            euler[ ++p ] = cicle[k];
            k--;
        }
        for ( start[ cicle[k] ]; start[ cicle[k] ] < graph[ cicle[k] ].size(); start[ cicle[k] ]++ ){
            int i = start[ cicle[k] ];
            int new_node = graph[ cicle[k] ][i].first;
            int number_arc = graph[ cicle[k] ][i].second;
            if ( viz[number_arc] == 0 ){
                modif( cicle[k], new_node, number_arc );
                start[ cicle[k] ] = i + 1;
                cicle[ ++k ] = new_node;
                break;
            }
        }
    }
    if ( p - 1 != m ){
        g << -1;
        return 0;
    }
    for ( int i = 1; i <= p - 1; i++ )
        g << euler[i] << ' ';
    return 0;
}