Cod sursa(job #680143)

Utilizator Teodor94Teodor Plop Teodor94 Data 14 februarie 2012 11:15:28
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

const int N = 100005;
const int M = 500005;

int n, m, fr[M];
vector <int> v[M], s;
pair <int, int> muchie[M];
bool marcat[M];

void citire() {
    scanf("%d%d", &n, &m);

    for (int i = 1; i <= m; ++i)  {
        int x, y;
        scanf("%d%d", &x, &y);

        v[x].push_back(i);
        v[y].push_back(i);
        muchie[i] = make_pair(x, y);
    }
}

void dfs(int nod) {
    while (fr[nod] < (int) v[nod].size()) {
        int y = v[nod][fr[nod]];

        if (marcat[y]) {
            ++fr[nod];
            continue;
        }

        marcat[y] = true;

        int next = muchie[y].first + muchie[y].second - nod;

        ++fr[nod];

        dfs(next);

        s.push_back(next);
    }
}

void rez() {
    bool ciclu = true;

    for (int i = 1; i <= n; ++i) {
        if (v[i].size() & 1) {
            ciclu = false;
            break;
        }
    }

    if (!ciclu) {
        printf("-1\n");
        return;
    }

    dfs(1);
}

void afis() {
    if ((int) s.size() != m) {
        printf("-1\n");
        return;
    }

    printf("1 ");

    for (int i = 1; i < (int) s.size(); ++i)
        printf("%d ", s[i]);
    printf("\n");
}

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

    citire();

    rez();

    afis();

    return 0;
}