Cod sursa(job #2657016)

Utilizator felix24mihaiPrava Felix Mihai felix24mihai Data 9 octombrie 2020 15:02:49
Problema Ciclu Eulerian Scor 80
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100001
#define SZ(x) ((int) (x).size())
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

int n, m;
vector <int> nodes[NMAX];
vector <int> result;
void read(){
    f >> n >> m;
    int x, y;
    for (int i = 1; i <= m; i++){
        f >> x >> y;
        nodes[x].push_back(y);
        if (x != y)
            nodes[y].push_back(x);
        else
            nodes[y].push_back(-2);
    }
}
void euler(int node){
    int i = 0;
    while (i < nodes[node].size()){
        if (nodes[node][i] != -2){
            int next = nodes[node][i];
            nodes[node].erase(nodes[node].begin() + i);
            i--;
            if (next != node){
                int index = 0;
                bool find = false;
                while (index < nodes[next].size() && find == false){
                    if (nodes[next][index] == node){
                        find = true;
                        nodes[next].erase(nodes[next].begin() + index);
                    }
                    index++;
                }
            }
            i++;
            euler(next);
        }
        else i++;
    }
    result.push_back(node);
}
int main()
{
    read();
    for (int i = 1; i <= n; ++i) {
        if (SZ(nodes[i]) & 1) {
            g << "-1\n";
            return 0;
        }
    }
    euler(1);
    for (int i = result.size() - 1; i > 0; i--)
        g << result[i] << " ";
    return 0;
}