Cod sursa(job #954341)

Utilizator SmarandaMaria Pandele Smaranda Data 28 mai 2013 22:36:24
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <cstdio>
#include <queue>
#include <list>
#include <stack>

using namespace std;

const long N = 100006;
long n, m, sol [N];
bool used [N];
list <long> v [N];
queue <long> q;
stack <long> st;

void read (){
    long i, x, y;
    scanf ("%ld%ld", &n, &m);
    for (i = 0; i < m; i ++){
        scanf ("%ld%ld", &x, &y);
        v [x].push_back(y);
        v [y].push_back(x);
    }
}

bool conex (){
    long temp, i;
    list <long> :: iterator it;
    q.push(1);
    used [1] = true;
    while (!q.empty()){
        temp = q.front();
        for (it = v [temp].begin(); it != v [temp].end(); ++ it)
            if (!used [*it]){
                used [*it] = true;
                q.push(*it);
            }
        q.pop();
    }
    for (i = 1; i <= n; i ++)
        if (used [i] == false)
            return 0;
    return 1;
}

bool Euler (){
    long i;
    if (conex() == 0)
        return 0;
    for (i = 1; i <= n; i ++)
        if (v [i].size() % 2)
            return 0;
    return 1;
}

void solve (){
    long temp, x, y, i;
    list <long> :: iterator it;
    if (Euler() == 0)
        printf ("-1\n");
    else {
        // nod de start = nod 1
        st.push(1);
        while (!st.empty()){
            temp = st.top();
            x = temp;
            while (!v [x].empty()){
                y = v [x].front();

                //stergere din x
                v [x].pop_front();


                //stergere din y
                for (it = v [y].begin(); it != v [y].end(); ++ it)
                    if (*it == x){
                        v [y].erase(it);
                        break;
                    }
                st.push(y);
                x = y;
            }
            st.pop();
            sol [++ sol [0]] = temp;
        }

        for (i = 1; i <= sol [0]; i ++)
            printf ("%ld ", sol [i]);
    }
}

int main () {

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

    read ();
    solve ();
    return 0;
}