Cod sursa(job #2821785)

Utilizator jaha01Jahaleanu Vlad-Gabriel jaha01 Data 23 decembrie 2021 01:26:05
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <bits/stdc++.h>

#define MAX_N 100001
#define MAX_M 500001

using namespace std;

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

int n, m;

vector<bool> visited(MAX_N);
vector<int> grad(MAX_N);
vector<int> sters(MAX_M);
vector<pair<int,int>> adj[MAX_N];

unordered_map<int,int> edge_count;
stack<int> stiva;


void DFS(int x)
{
    visited[x] = true;

    for (auto vecin: adj[x])
        if (!visited[vecin.first])
            DFS(vecin.first);
}

void euler(int x)
{
    while (!adj[x].empty())
    {
        while (!adj[x].empty() && sters[adj[x].back().second]) {
            adj[x].pop_back();
        }

        if (!adj[x].empty())
        {
            int urm = adj[x].back().first;
            int nrMuchie = adj[x].back().second;
            sters[nrMuchie] = 1;
            adj[x].pop_back();
            euler(urm);
        }
    }
    stiva.push(x);
}


int main()
{
    int first, second, nr_muchie = 0;
    f>>n>>m;

    for (int i = 1; i <= m; i++)
    {
        nr_muchie++;
        f>>first>>second;
        adj[first].push_back(make_pair(second, nr_muchie));
        adj[second].push_back(make_pair(first, nr_muchie));
    }

    DFS(1);

    for (int i = 1; i <= n; i++)
    {
        edge_count[i] = adj[i].size();

        if (edge_count[i] % 2 != 0 || !visited[i])
        {
            g<<-1;
            return 0;
        }
    }

    euler(1);

    while (!stiva.empty())
    {
        if (stiva.size())
            g<<stiva.top()<<" ";
        stiva.pop();
    }

    return 0;
}