Cod sursa(job #2907703)

Utilizator Vaida_Radu_AndreiVaida Radu Andrei Vaida_Radu_Andrei Data 31 mai 2022 11:39:38
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <stack>
#include <vector>
#define nMax 100024

using namespace std;

int n, grades[nMax], viz[nMax];
vector <pair<int,int>> graph[nMax];
vector <int> sol;

void read() {
    int i,m,x,y;
    scanf("%d%d",&n,&m);
    for(i=0;i<m;++i) {
        scanf("%d%d",&x,&y);
        graph[x].emplace_back(y,i);
        graph[y].emplace_back(x,i);
        ++grades[x];
        ++grades[y];
    }
}

bool isEulerian() {
    int i;
    for(i=0;i<n;++i) {
        if(grades[i]%2) {
            return false;
        }
    }
    return true;
}

void solve() {
    int node;
    stack <int> s;
    for(s.push(1); !s.empty();) {
        node = s.top();

        if(!graph[node].empty()) {
            auto edg = graph[node].back();
            graph[node].pop_back();

            if(!viz[edg.second]) {
                ++viz[edg.second];
                s.push(edg.first);
            }
        }
        else {
            sol.push_back(node);
            s.pop();
        }
    }
}

bool isNotConnex() {
    int i;
    for(i=0;i<n;++i) {
        if(!viz[i]) {
            return false;
        }
    }
    return true;
}

void display() {
    if(isNotConnex()) {
        printf("-1");
        return;
    }
    for(int i = 1; i < sol.size(); ++i) {
        printf("%d ",sol[i]);
    }
}

int main() {
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    read();
    if(isEulerian()) {
        solve();
        display();
    }
    else {
        printf("-1");
    }
    return 0;
}