Cod sursa(job #1502884)

Utilizator stefanzzzStefan Popa stefanzzz Data 15 octombrie 2015 08:59:11
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <stdio.h>
#include <vector>
#define MAXN 100005
#define MAXM 500005
using namespace std;

int n, m, x, y, d[MAXN];
vector< pair<int, int> > G[MAXN];
vector<int> sol;
bool er[MAXM], uz[MAXN];

int main()
{
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);

    scanf("%d %d", &n, &m);
    for(int i = 1; i <= m; i++) {
        scanf("%d %d", &x, &y);
        G[x].push_back(make_pair(y, i));
        G[y].push_back(make_pair(x, i));
        d[x]++;
        d[y]++;
    }
    for(int i = 1; i <= n; i++)
        if(d[i] & 1) {
            printf("-1\n");
            return 0;
        }

    vector<int> st;
    st.push_back(1);

    while(!st.empty()) {
        int x = st.back();
        while(!G[x].empty() && er[G[x].back().second]) G[x].pop_back();
        if(G[x].empty()) {
            st.pop_back();
            sol.push_back(x);
            uz[x] = 1;
            continue;
        }

        er[G[x].back().second] = 1;
        st.push_back(G[x].back().first);
        G[x].pop_back();
    }

    bool flag = 0;
    for(int i = 1; i <= n; i++)
        if(!uz[i] && !G[i].empty())
            flag = 1;

    if(!flag) {
        sol.pop_back();
        for(auto x: sol)
            printf("%d ", x);
        printf("\n");
    }
    else printf("-1\n");

    return 0;
}