Cod sursa(job #2374884)

Utilizator hristacheruxiRuxandra Hristache hristacheruxi Data 7 martie 2019 21:05:04
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
using namespace std;

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

void euler(int node)
{
    s[++k] = node;
    if (seen[node])
        while (degree[s[k]] == 0 && k != 0)
            ans[++nr] = s[k--];
    else
        seen[node] = 1;
    if (k > 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});
    }

    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;
}