Cod sursa(job #2323276)

Utilizator tnocNume corect tnoc Data 19 ianuarie 2019 00:27:35
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.32 kb
#include <iostream>
#include <cstdio>
#include <list>
#include <algorithm>
#define NMAX 100010
#define MMAX 500010

using namespace std;

struct Nod {
    int inf;
    Nod* next;
    Nod* prev;
    Nod* comp;
    Nod(int _inf) : inf(_inf) {
        next = nullptr;
        prev = nullptr;
        comp = nullptr;
    }
};

struct LinkedList {
    Nod* start;
    Nod* fin;
    int sz;
    LinkedList() {
        start = fin = nullptr;
        sz = 0;
    }
    Nod* push(int val) {
        Nod* toAdd = new Nod(val);
        if (start == nullptr) {
            start = fin = toAdd;
        }
        else {
            fin->next = toAdd;
            toAdd->prev = fin;
            fin = toAdd;
        }
        sz++;
        return toAdd;
    }
    pair<int, Nod*> pop() {
        int vecin = fin->inf;
        Nod* comp = fin->comp;
        rm(fin);
        return {vecin, comp};
    }
    void rm(Nod* it) {
        if (fin == it)
            fin = it->prev;
        if (start == it)
            start = it->next;
        if (it->next != nullptr)
            it->next->prev = it->prev;
        if (it->prev != nullptr)
            it->prev->next = it->next;
        sz--;
        delete it;
    }
    int size() {
        return sz;
    }
    bool empty() {
        return sz == 0;
    }
};

int n, m, sterse;
LinkedList v[NMAX];
int stiv[MMAX], st;

void citire()
{
    scanf("%d %d", &n, &m);
    int t1, t2;
    for (int i = 1; i <= m; i++)
    {
        scanf("%d %d", &t1, &t2);
        Nod* s1 = v[t1].push(t2);
        Nod* s2 = v[t2].push(t1);
        s1->comp = s2;
        s2->comp = s1;
    }
}

void euler()
{
    for (int i = 1; i <= n; i++)
        if (v[i].size()%2)
    {
         printf("-1");
            return;
    }
    stiv[++st] = 1;
    while (st > 0)
    {
        int top = stiv[st];

        if (v[top].empty())
        {
            printf("%d ", top);
            st--;
        }
        else {
            pair<int, Nod*> next = v[top].pop();
            v[next.first].rm(next.second);
            stiv[++st] = next.first;
        }
    }
}

int main()
{
    std::ios::sync_with_stdio(false);
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);

    citire();
    euler();

    return 0;
}