Cod sursa(job #2360609)

Utilizator SemetgTemes George Semetg Data 1 martie 2019 23:19:37
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;

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

const int N_MAX = 100005;
const int M_MAX = 5 * N_MAX;

int N, M;
vector<int> g[N_MAX];
pair<int, int> e[M_MAX];
bitset<M_MAX> used;

void read() {
    in >> N >> M;
    
    for (int i = 1; i <= M; ++i) {
        in >> e[i].first >> e[i].second;
        
        g[e[i].first].push_back(i);
        g[e[i].second].push_back(i);
    }
}

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

void solve() {
    vector<int> st;
    
    st.push_back(1);
    while (!st.empty()) {
        int node = st.back();
        
        if (!g[node].empty()) {
            int edge = g[node].back();
            g[node].pop_back();
            
            if (!used[edge]) {
                used[edge] = true;
                
                if (e[edge].first != node)
                    st.push_back(e[edge].first);
                else
                    st.push_back(e[edge].second);
            }
        } else {
            if (st.size() > 1)
                out << node << ' ';
            
            st.pop_back();
        }
    }
}

int main() {
    read();
    
    if (!eulerian()) {
        out << -1;
        return 0;
    }
    
    solve();
}