Cod sursa(job #2352096)

Utilizator DavidLDavid Lauran DavidL Data 22 februarie 2019 22:42:59
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 1e5 + 5;
const int MMAX = 5e5 + 5;

int n, m;
vector < pair<int, int> > G[NMAX];
bool ok[MMAX];
int deg[NMAX];
int st, dr;

int main()
{
    FILE *fi, *fo;
    fi = fopen("ciclueuler.in", "r");
    fo = fopen("ciclueuler.out", "w");

    fscanf(fi, "%d%d", &n, &m);
    for (int i = 1; i <= m; i++)
    {
        int u, v;
        fscanf(fi, "%d%d", &u, &v);
        G[u].push_back({v, i});
        G[v].push_back({u, i});
        ok[i] = 1;
        deg[u]++;
        deg[v]++;
    }

    bool euler = 1;
    for (int i = 1; i <= n; i++)
        if (deg[i] % 2 == 1)
            euler = 0;

    if (!euler)
    {
        fprintf(fo, "-1");
        return 0;
    }

    vector <int> s;
    vector <int> rez;
    s.push_back(1);
    while (!s.empty())
    {
        int nod = s.back();
        if (!G[nod].empty())
        {
            pair <int, int> v = G[nod].back();
            G[nod].pop_back();
            int vec = v.first, much = v.second;

            if (!ok[much])
            {
                continue;
            }
            ok[much] = 0;
            s.push_back(vec);
        }
        else
        {
            s.pop_back();
            rez.push_back(nod);
        }
    }

    rez.pop_back();
    if (rez.size() != m) // neconex
    {
        fprintf(fo, "-1");
        return 0;
    }
    for (auto x: rez)
        fprintf(fo, "%d ", x);

    return 0;
}