Cod sursa(job #1751409)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 1 septembrie 2016 13:14:22
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <stack>
#include <bitset>

using namespace std;

multiset <int> q[100005];
stack <int> s;
vector <int> ans;
bitset <100005> viz;

void dfs(int node){
    viz[node] = 1;
    for(auto it : q[node]){
        if(viz[it] == 0){
            dfs(it);
        }
    }
}

int main(){
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);
    int i, n, m, x, y;
    scanf("%d %d", &n, &m);
    for(i = 1;i <= m;i++){
        scanf("%d %d", &x, &y);
        q[x].insert(y);
        q[y].insert(x);
    }
    for(i = 1;i <= n;i++){
        if(q[i].size()%2 == 1){
            printf("-1");
            return 0;
        }
    }
    dfs(1);
    for(i = 2;i <= n;i++){
        if(viz[i] == 0){
            printf("-1");
            return 0;
        }
    }
    s.push(1);
    while(s.empty() == false){
        x = s.top();
        if(q[x].empty() == true){
            s.pop();
            ans.push_back(x);
            continue;
        }
        auto it = q[x].begin();
        s.push(*it);
        q[*it].erase(q[*it].find(x));
        q[x].erase(q[x].begin());
    }
    for(auto it : ans){
        printf("%d ",it);
    }
    return 0;
}