Cod sursa(job #2817298)

Utilizator dascalu_maraDascalu Mara Elena dascalu_mara Data 13 decembrie 2021 14:51:08
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
//
//  main.cpp
//  ciclu euler separat
//
//  Created by Mara Dascalu on 13/12/2021.
//

#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#include <bits/stdc++.h>
#include <map>
#include <list>
#include <set>
#include <tuple>

#define INF INT_MAX
#define N  100005
#define M  500001
typedef std::tuple<int, int> tpl;

using namespace std;

ifstream input("ciclueuler.in");
ofstream output("ciclueuler.out");

vector<int> Euler()
{
    vector<tpl> edges[N];
    bool eliminated[M] = {false};
    stack<int> stack_euler;
    vector<int> eulerCircuit;
    
    int no_nodes, no_edges;
    input >> no_nodes >> no_edges;
    
    for (int i = 0 ; i < no_edges ; i++)
    {
        int x, y;
        input>>x>>y;
        edges[x].push_back(make_tuple(y,i));
        edges[y].push_back(make_tuple(x,i));
    }
    
    for (int i = 1 ; i <= no_nodes ; i++)
    {
        if (edges[i].size() % 2)
        {
            eulerCircuit.push_back(-1);
            return eulerCircuit;
        }
    }
    
    stack_euler.push(1);
    while (!stack_euler.empty())
    {
        int node = stack_euler.top();
        if (!edges[node].empty())
        {
            tpl t = edges[node].back();
            edges[node].pop_back();
            
            int adj_node = get<0>(t);
            int edge_code = get<1>(t);
            
            if (!eliminated[edge_code])
            {
                eliminated[edge_code] = true;
                stack_euler.push(adj_node);
            }
        }
        else
        {
            stack_euler.pop();
            eulerCircuit.push_back(node);
        }
    }
    
    return eulerCircuit;
}

int main(int argc, const char * argv[])
{
    vector<int> result;
    result = Euler();
    cout<<" ";

    for (int i = 0 ; i < result.size() -1 ; i++)
        output << result[i] << " ";

    return 0;
}