Cod sursa(job #2509388)

Utilizator AntoniuFicAntoniu Ficard AntoniuFic Data 14 decembrie 2019 10:40:34
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>
#include <vector>
#include <stack>
#include <functional>

using namespace std;

vector<pair<pair<int, int>, bool>> muchii;
vector<int> noduri[100000];
int n, m;

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

bool eEulerian(){
    vector<int> body;
    for (int i = 0; i < n; ++i) {
        body.push_back(0);
        if(noduri[i].size() % 2 != 0)
            return false;
    }
    int bodies = 1;
    function<void(int, vector<int>&, int)> dfs = [&dfs](int nod, vector<int> &body, int bodies) -> void {
        if(!noduri[nod].empty()){
            body[nod] = bodies;
        }
        for (int i : noduri[nod]) {
            int destination = muchii[i].first.second;
            if(body[destination] == 0)
                dfs(destination, body, bodies);
        }
    };
    for (int i = 0; i < n; ++i) {
        if(!noduri[i].empty() && body[i] == 0){
            if(bodies == 2)
                return false;
            dfs(i, body, bodies++);
        }
    }
    return true;
}

void euler(){
    stack<int> S;
    for(int i = 0; i < n; ++i){
        if(!noduri[i].empty()){
            S.push(i);
            break;
        }
    }
    while(!S.empty()){
        int nod = S.top();
        if(noduri[nod].empty()){
            S.pop();
            g<<nod + 1<<' ';
            continue;
        }
        int muchie = noduri[nod].back();
        if(muchii[muchie].second){
            noduri[nod].pop_back();
            continue;
        }
        S.push(muchii[muchie].first.second);
        muchii[muchie].second = true;
        noduri[nod].pop_back();
    }
}

int main() {
    f>>n>>m;
    for (int i = 0; i < m; ++i) {
        int start, end;
        f>>start>>end;
        muchii.emplace_back(make_pair(start - 1, end - 1), false);
        noduri[start - 1].push_back(muchii.size() - 1);
        noduri[end - 1].push_back(muchii.size() - 1);
    }
    if(eEulerian()){
        euler();
    }else g<<-1;
    return 0;
}