Cod sursa(job #2075293)

Utilizator anisca22Ana Baltaretu anisca22 Data 25 noiembrie 2017 12:42:37
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 3.18 kb
#include <bits/stdc++.h>
#define NMAX 100005
#define MMAX 500005
#define pii pair <int, int>
#define INF 0x3f3f3f3f

using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

int N, M, start;
int viz[MMAX], tip[MMAX], h[NMAX];
vector <pii> v[NMAX];
stack <int> st;
stack <pii> act;

void dfs_iterativ()
{
    act.push({1, 0});
    while (!act.empty())
    {
        int nod = act.top().first;
        int it = act.top().second;
        act.pop();
        for (; it < v[nod].size(); it++)
        {
            pii nxt = v[nod][it];
            if (tip[nxt.second] == 0)
            {
                if (h[nxt.first] < h[nod])
                    tip[nxt.second] = 2;
                else tip[nxt.second] = 1;
                h[nxt.first] = min(h[nod] + 1, h[nxt.first]);
                act.push({nod, it + 1});
                act.push({nxt.first, 0});
                break;
            }
        }
    }
}
/**
void rec_iterativ()
{
    act.push({1, 0});
    while (!act.empty())
    {
        int nod = act.top().first;
        int it = act.top().second;
        act.pop();
        for (; it < v[nod].size(); it++)
        {
            pii nxt = v[nod][it];
            if (viz[nxt.second] == 0 && tip[nxt.second] == 1)
            {
                viz[nxt.second] = 1;
                rec(nxt.first);
                act.push({nod, it + 1});
                act.push({nxt.first, 0});
                break;
            }
        }
    }
    vector <pii> :: iterator it;
    /// FATA
    for (it = v[nod].begin(); it != v[nod].end(); it++)
    {
        pii nxt = *it;
        if (viz[nxt.second] == 0 && tip[nxt.second] == 1)
        {
            viz[nxt.second] = 1;
            rec(nxt.first);
        }
    }
    /// SPATE
    for (it = v[nod].begin(); it != v[nod].end(); it++)
    {
        pii nxt = *it;
        if (viz[nxt.second] == 0 && tip[nxt.second] == 2)
        {
            viz[nxt.second] = 1;
            rec(nxt.first);
        }
    }
    st.push(nod);
}
*/
void rec(int nod)
{
    vector <pii> :: iterator it;
    /// FATA
    for (it = v[nod].begin(); it != v[nod].end(); it++)
    {
        pii nxt = *it;
        if (viz[nxt.second] == 0 && tip[nxt.second] == 1)
        {
            viz[nxt.second] = 1;
            rec(nxt.first);
        }
    }
    /// SPATE
    for (it = v[nod].begin(); it != v[nod].end(); it++)
    {
        pii nxt = *it;
        if (viz[nxt.second] == 0 && tip[nxt.second] == 2)
        {
            viz[nxt.second] = 1;
            rec(nxt.first);
        }
    }
    st.push(nod);
}

int main()
{
    fin >> N >> M;
    for (int i = 1; i <= M; i++)
    {
        int x, y;
        fin >> x >> y;
        v[x].push_back({y, i});
        v[y].push_back({x, i});
    }
    for (int i = 1; i <= N; i++)
    {
        if (v[i].size() % 2 != 0)
        {
            fout << "-1\n";
            return 0;
        }
    }
    for (int i = 2; i <= N; i++)
        h[i] = INF;
    h[1] = 1;
    dfs_iterativ();
    rec(1);
    while (st.size() != 1)
    {
        fout << st.top() << " ";
        st.pop();
    }
    return 0;
}