Cod sursa(job #2437743)

Utilizator MatteoalexandruMatteo Verzotti Matteoalexandru Data 10 iulie 2019 10:59:36
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
// Matteo Verzotti - C++
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <ctime>
#include <map>
#include <chrono>
#include <cmath>
#define INF 0x3f3f3f3f
#define MAX(a,b) a>b ? a:b
#define MIN(a,b) a<b ? a:b

using namespace std;

const int NODE = 1e5;
const int EDGE = 5 * 1e5;

pair <int,int> edge[5 + EDGE];
vector <int> v[5 + NODE];
bool viz[5 + EDGE];
vector <int> sol;
stack <int> st;

int main() {
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    int n,m,i,j,x,y;
    scanf("%d%d",&n,&m);
    for(i=1; i<=m; i++) {
        scanf("%d%d",&x,&y);
        edge[i] = {x,y};
        v[x].push_back(i);
        v[y].push_back(i);
    }
    for(i=1; i<=n; i++) {
        if(v[i].size() & 1) {
            printf("-1\n");
            return 0;
        }
    }
    st.push(1);
    while(!st.empty()) {
        int node = st.top();
        if(v[node].size() > 0) {
            int mu = v[node].back();
            v[node].pop_back();
            if(!viz[mu]) {
                viz[mu] = 1;
                x = edge[mu].first;
                y = edge[mu].second;
                if(y == node)
                    swap(x,y);
                st.push(y);
            }
        } else {
            sol.push_back(node);
            st.pop();
        }
    }
    sol.pop_back();
    for(i=0; i<sol.size(); i++)
        printf("%d ",sol[i]);
    printf("\n");
    return 0;
}