Cod sursa(job #2807608)

Utilizator Albert_GAlbert G Albert_G Data 23 noiembrie 2021 23:14:12
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <stack>
#include <vector>

std::ifstream in("ciclueuler.in");
std::ofstream out("ciclueuler.out");

constexpr int N = 1e5+1;
constexpr int M = 5e5+1;

std::stack<int> st;
std::pair<int, int> edges[M]; // edge[i] = {a,b} -> a, b are vertices of edge i
std::vector<int> g[N]; // g[a] -> the set of edges of vertice a
int poz[N], n, m, rez[M], cnt;
bool removed[M];

bool is_euler(){
    for(int i=1;i<=n;++i){
        if(g[i].size() % 2)
            return false;
    }
    return true;
}

int search_edge(int x){
    int lim = g[x].size();
    for(int i = poz[x]; i < lim; ++ i){
        int edge = g[x][i];
        if(!removed[edge]){
            removed[edge] = true;
            poz[x] = i + 1;
            return edge;
        }
    }
    return -1;
}

int main(){
    in >> n >> m;
    for(int i=0;i<m;++i){
        int x, y;
        in >> x >> y;
        edges[i] = { x, y };
        g[x].push_back(i);
        g[y].push_back(i);
    }
    in.close();
    if(!is_euler()){
        out << -1;
        return 0;
    }
    st.push(1);
    while(!st.empty()){
        int ver = st.top();
        int edge = search_edge(ver);
        if(edge == -1){
            st.pop();
            if(st.empty()) break;
            rez[cnt++] = ver;
        }
        else{
            int top_ver = edges[edge].first==ver ? edges[edge].second : edges[edge].first ;
            st.push(top_ver);
        }
    }
    if(cnt!=m){
        out<<-1;
        return 0;
    }
    for(int i=0;i<cnt;++i)
        out<<rez[i]<<' ';
    out.close();
    return 0;
}