Cod sursa(job #2821481)

Utilizator Angel2IonitaAngel Ionita Angel2Ionita Data 22 decembrie 2021 17:15:29
Problema Ciclu Eulerian Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

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

class Graph
{
public:
    vector<vector<int>> adjList;
    int size;
    Graph(int n)
    {
        size = n;
        adjList.resize(size);
    }
    void addEdgeMultigraph(int start, int end, int i, vector<int> &source, vector<int> &destination)
    {
        adjList[start].push_back(i);
        adjList[end].push_back(i);
        source.push_back(start);
        destination.push_back(end);
    }
    vector<int> eulerian_cycle(vector<int> &source, vector<int> &destination)
    {
        vector<int> result;
        vector<bool> usedEdge(size, false);
        stack<int> st;
        for (int i = 0; i < size; i++)
        {
            if (adjList[i].size() % 2 == 1)
            {
                result.push_back(-1);
                return result;
            }
        }
        st.push(0);
        while (!st.empty())
        {
            int node = st.top();
            if (!adjList[node].empty())
            {
                int e = adjList[node].back();
                adjList[node].pop_back();
                if (!usedEdge[e])
                {
                    usedEdge[e] = true;
                    int to = source[e] ^ destination[e] ^ node;
                    st.push(to);
                }
            }
            else
            {
                st.pop();
                result.push_back(node + 1);
            }
        }
        return result;
    }
};

int main()
{
    vector<int> source,destination;
    int N, M, x, y;
    f >> N >> M;
    Graph g(N);
    for (int i = 0; i < M; i++)
    {
        f >> x >> y;
        g.addEdgeMultigraph(x - 1, y - 1, i,source,destination);
    }
    vector<int> result = g.eulerian_cycle(source,destination);
    if (result[0] == -1)
        o << -1;
    else
        for (int i = 0; i < result.size() - 1; i++)
            o << result[i] << ' ';
}