Cod sursa(job #1444498)

Utilizator SmarandaMaria Pandele Smaranda Data 29 mai 2015 20:29:43
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#include <stack>
#include <vector>

using namespace std;

const int N = 1000002;

int grad [N];
stack <int> st;

pair <int, int> E [5 * N];
bool used [5 * N];
vector <int> graph [N], ans;
vector <int> :: iterator it [N];

int main () {
    int n, m, i, x, y, fiu, ok;
    vector <int> :: iterator jt;

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

    scanf ("%d%d", &n, &m);
    for (i = 1; i <= m; i ++) {
        scanf ("%d%d", &x, &y);
        grad [x] ++;
        grad [y] ++;
        E [i] = make_pair (x, y);
        graph [x].push_back (i);
        graph [y].push_back (i);
    }
    for (i = 1; i <= n; i ++) {
        if (grad [i] % 2) {
            printf ("-1\n");
            return 0;
        }
        it [i] = graph [i].begin ();
    }
    st.push (1);
    while (!st.empty ()) {
        x = st.top ();
        ok = 1;
        for (;it [x] != graph [x].end (); ++ it [x]) {
            if (used [*it [x]])
                continue;
            if (E [*it [x]].first == x)
                fiu = E [*it [x]].second;
            else fiu = E [*it [x]].first;
            used [*it [x]] = 1;
            st.push (fiu);
            ok = 0;
            break;
        }
        if (ok) {
            ans.push_back (x);
            st.pop ();
        }
    }
    for (jt = ans.begin (); jt != ans.end (); ++ jt)
        printf ("%d ", *jt);
    printf ("\n");
    return 0;
}