Cod sursa(job #1493826)

Utilizator bpalaniciPalanici Bogdan bpalanici Data 29 septembrie 2015 22:37:45
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;

const int N = 100005;
const int M = 500005;

vector < pair <int, int> > graf[N];
vector <int> rez;
bitset <N> viz;
bitset <M> m_viz;
int grad[N];
int n, m;

void dfs(int nod)
{
    viz[nod] = true;
    for (const auto &it : graf[nod])
        if (!viz[it.first])
        dfs(it.first);
}

void euler(int start)
{
    vector <int> stiva;
    stiva.clear();
    stiva.push_back(start);
    while (!stiva.empty())
    {
        int nod = stiva.back();
        if (graf[nod].empty())
        {
            stiva.pop_back();
            rez.push_back(nod);
            continue;
        }
        if (m_viz[graf[nod].back().second])
            {graf[nod].pop_back(); continue;}
        m_viz[graf[nod].back().second] = true;
        stiva.push_back(graf[nod].back().first);
        graf[nod].pop_back();
    }
}

int main()
{
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for (int i = 1, x, y; i <= m; i++)
        scanf("%d %d", &x, &y),
        graf[x].push_back(make_pair(y, i)),
        graf[y].push_back(make_pair(x, i)),
        grad[x]++,
        grad[y]++;
    dfs(1);
    for (int i = 1; i <= n; i++)
        if ((grad[i] & 1) || (!viz[i]))
        { printf("-1"); return 0;}
    euler(1);
    for (vector <int>::iterator it = rez.begin(); it != rez.end() - 1; it++)
        printf("%d ", *it);

}