Cod sursa(job #1813444)

Utilizator a96tudorAvram Tudor a96tudor Data 22 noiembrie 2016 23:03:16
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
/**
 *      Program that determines wether a given multigraph
 *   is eulerian or not. Prints :
 *
 *              (a) A nodes sequence that determines the
 *              eulerian cycle if it is one
 *              (b) -1 if it is not
 *
 *       EUCLIDIAN CYCLE  = a cycle where every edge
 *                  is visited only once
 *
 * Created by Tudor Avram on 22/11/16.
*/

#include<cstdio>
#include<vector>
#include<list>

#define N_MAX 100001
#define pb push_back
#define iterator vector<int>::iterator
using namespace std;

vector<int> G[N_MAX];
list<int> Q;

void Solve(int node) {
    Q.pb(node);
    while (!Q.empty()) {
        int src = Q.front();
        if (G[src].empty()) {
            Q.pop_front();
            printf("%d ", src);
        } else {
            int dest = G[src].back();
            Q.push_front(dest);
            G[src].pop_back();

            for (iterator it = G[dest].begin(); it!=G[dest].end(); it++) {
                if (*it == src) {
                    G[dest].erase(it);
                    break;
                }
            }
        }
    }
}

bool read_data() {
    int N, M;
    scanf("%d%d", &N, &M);

    for (int i = 1; i <= M; i++) {
        int x,y;
        scanf("%d%d", &x, &y);
        G[x].pb(y);
        G[y].pb(x);
    }

    for (int i = 1; i <= N; i++) {
        if (G[i].size() % 2 == 1) {
            // we can't have a Eulerian cycle
            return false;
        }
    }
    return true;
}

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

    bool possible = read_data();
    if (possible) Solve(1);
    else printf("-1\n");

    fclose(stdin);
    fclose(stdout);
    return 0;
}