Cod sursa(job #2509414)

Utilizator AntoniuFicAntoniu Ficard AntoniuFic Data 14 decembrie 2019 10:54:16
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 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();
            if(!S.empty())
                g<<nod + 1<<' ';
            continue;
        }
        int muchie = noduri[nod].back();
        if(muchii[muchie].second){
            noduri[nod].pop_back();
            continue;
        }
        if(muchii[muchie].first.first == nod)
            S.push(muchii[muchie].first.second);
        else S.push(muchii[muchie].first.first);
        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;
}