Cod sursa(job #2375103)

Utilizator hristacheruxiRuxandra Hristache hristacheruxi Data 7 martie 2019 22:19:16
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
using namespace std;

const int N = 100001;
const int M = 500001;
vector <pair <int, int > >v[N];
vector <int>s;
int degree[N], ans[M], k, nr;
char seen[N], edge[M];

void euler(int node)
{
    s.push_back(node);
    if (seen[node])
        while (s.size() != 0 && degree[s.back()] == 0)
        {
            ans[++nr] = s.back();
            s.pop_back();
        }
    else
        seen[node] = 1;
    if (s.size() > 0)
        for (int i = 0; i < v[node].size(); ++i)
        {
            int x = v[node][i].first; //node
            int y = v[node][i].second; //edge
            if (edge[y] == 0)
            {
                edge[y] = 1;
                degree[node]--;
                degree[x]--;

                euler(x);
            }
        }
}

int main()
{
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);
    int n, m, i, a, b;

    scanf("%d%d", &n, &m);
    for (i = 1; i <= m; ++i)
    {
        scanf("%d%d", &a, &b);

        degree[a]++;
        degree[b]++;

        v[a].push_back({b, i});
        v[b].push_back({a, i});

        edge[i] = 0;
    }

    for (i = 1; i <= n; ++i)
    {
        if (degree[i] % 2 == 1)
        {
            printf("-1");
            return 0;
        }
    }

    euler(1);

    for (i = 1; i <= nr; ++i)
        printf("%d ", ans[i]);
    return 0;
}