Cod sursa(job #2161517)

Utilizator RazorBestPricop Razvan Marius RazorBest Data 11 martie 2018 19:15:26
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>
using namespace std;

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

int n, m, s[500001], len;
vector<int> adj[100001];
pair<int, int> M[500001];
bool b[500001], grad[100001];

void dfs(int nod)
{
    s[len++] = nod;

    while (len)
    {
        nod = s[len - 1];
        if (adj[nod].size() == 0)
        {
            fout << nod << ' ';
            len--;
            continue;
        }
        while (adj[nod].size())
        {
            int edge = adj[nod].back();
            adj[nod].pop_back();
            if (!b[edge])
            {
                b[edge] = 1;
                if (M[edge].first != nod)
                    s[len++] = M[edge].first;
                else
                    s[len++] = M[edge].second;
                nod = s[len - 1];
                break;
            }
        }
    }
}

int main()
{
    int x, y;

    fin >> n >> m;

    for (int i = 0; i < m; i++)
    {
        fin >> x >> y;

        M[i] = make_pair(x, y);
        adj[x].push_back(i);
        if (x != y)
            adj[y].push_back(i);
        grad[x] = !grad[x];
        grad[y] = !grad[y];
    }

    for (int i = 1; i <= n; i++)
        if (grad[i])
        {
            fout << -1;
            return 0;
        }
    dfs(1);

    return 0;
}