Cod sursa(job #3333604)

Utilizator Sasha_12454Eric Paturan Sasha_12454 Data 14 ianuarie 2026 14:11:44
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("ciclueuler.in");
ofstream g ("ciclueuler.out");

#define int long long

const int NMAX = 1e5 + 5;

int n, m;

vector <pair<int, int>> v[NMAX];

bitset <5 * NMAX> visited;

vector <int> path;

void dfs1(int nod)
{
    visited[nod] = true;

    for(auto & i : v[nod])
    {
        if(visited[i.first]) continue;

        dfs1(i.first);
    }
}

inline bool check()
{
    dfs1(1);

    for(int i = 1; i <= n; i ++)
    {
        if(visited[i] == false)
        {
            return false;
        }
    }

    visited &= 0;

    for(int i = 1; i <= n; i ++)
    {
        if(v[i].size() % 2)
        {
            return false;
        }
    }

    return true;
}

void dfs(int nod)
{
    while(!v[nod].empty())
    {
        int x = v[nod].back().first;
        int y = v[nod].back().second;

        v[nod].pop_back();

        if(visited[y]) continue;

        visited[y] = true;

        dfs(x);
    }

    path.push_back(nod);
}

int32_t main()
{

    //ios_base :: sync_with_stdio(false);
    //cin.tie(0);

    f >> n >> m;

    for(int i = 1; i <= m; i ++)
    {
        int x, y;
        f >> x >> y;

        v[x].push_back({y, i});
        v[y].push_back({x, i});
    }

    if(check() == false)
    {
        g << -1;

        return 0;
    }

    dfs(1);

    path.pop_back();

    for(int i = 1; i <= m; i ++)
    {
        if(visited[i] == false)
        {
            g << -1;
            return 0;
        }
    }

    for(auto & i : path)
    {
        g << i << " ";
    }

    return 0;
}