Cod sursa(job #2750040)

Utilizator inwursuIanis-Vlad Ursu inwursu Data 9 mai 2021 17:56:37
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
// Euler.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

const int MAX_N = 1e5 + 1;
const int MAX_M = 5 * 1e5 + 1;

ifstream fin{ "ciclueuler.in" };
ofstream fout{ "ciclueuler.out" };

int N{ 0 }, M{ 0 };
vector<vector<pair<int, int>>> adj(MAX_N);    

vector<bool> seen(MAX_M, false);
vector<int> cycle;          

void dfs_euler(int u)
{
    while (adj[u].size())
    {
        int v = adj[u].back().first;
        int e = adj[u].back().second;
        adj[u].pop_back();

        if (seen[e] == false)
        {
            seen[e] = true;
            dfs_euler(v);
        }
    }

    cycle.push_back(u);
}


int cnt{ 0 };
vector<bool> visited(MAX_N, false);

void dfs(int u)
{
    visited[u] = true;

    for (pair<int, int> p : adj[u])
    {
        if (visited[p.first] == false)
        {
            dfs(p.first);
        }
    }
}


int main()
{
    fin >> N >> M;

    for (int i = 1; i <= M; ++i)
    {
        int u, v;
        fin >> u >> v;

        adj[u].push_back({ v, i });
        adj[v].push_back({ u, i });
    }


    for (int u = 1; u <= N; ++u)
    {
        if (adj[u].size() % 2 != 0)
        {
            fout << -1 << endl;

            return 0;
        }
    }

   
    for (int u = 1; u <= N; ++u)
    {
        if (visited[u] == false && adj[u].size() != 0)
        {
            dfs(u);
            cnt++;
        }
    }

    if (cnt > 1)
    {
        fout << -1 << endl;

        return 0;
    }


    dfs_euler(1);
    cycle.pop_back();

    for (int u : cycle)
    {
        fout << u << " ";
    }

    fout << endl;
}