Cod sursa(job #2849620)

Utilizator SmauSmau George Robert Smau Data 15 februarie 2022 13:17:07
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

struct Muchie {
    int x, y;
    bool used;
};

vector <vector <int>> G;
vector <Muchie> M;
vector <int> ans;

int n, m;

void Input() {
    fin >> n >> m;

    G.resize(n + 1);
    for(int i = 0; i < m; i ++) {
        int x, y;
        fin >> x >> y;
        
        M.push_back({x, y, false});

        G[x].push_back(i);
        G[y].push_back(i);
    }
}

bool GradePare() {
    for(auto x : G)
        if(x.size() % 2) return false;
    return true;
}

void CicluEulerian() {
    stack <int> S;
    S.push(1);

    while(!S.empty()) {
        int curr = S.top();

        if(G[curr].empty()) {
            ans.push_back(curr);
            S.pop();
        } else {
            int last = G[curr].back();
            G[curr].pop_back();
            
            if(!M[last].used) {
                M[last].used = true;
                
                if(M[last].x == curr) S.push(M[last].y);
                else S.push(M[last].x);
            }
        }

    }
}

void Output() {
    if(ans.size() - 1 != m) {
        fout << "-1\n";
        return;
    }
    
    ans.pop_back();
    for(auto x : ans) fout << x << ' ';
    fout << '\n';
}

int main() {
    Input();

    if(!GradePare()) {
        fout << "-1\n";
        return 0;
    }
    
    CicluEulerian();
    Output();

    return 0;
}