Cod sursa(job #954361)

Utilizator SmarandaMaria Pandele Smaranda Data 28 mai 2013 23:16:01
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <cstdio>
#include <queue>
#include <list>
#include <stack>

using namespace std;

const long N = 100006;
long n, m, sol [N], size[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);
        size [x] ++;
        size [y] ++;
    }
}

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
        x = 1;
        do{
            while (size [x]){
                st.push(x);
                y = v [x].front();

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


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

        printf ("1 ");
        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;
}