Cod sursa(job #2841032)

Utilizator borcanirobertBorcani Robert borcanirobert Data 29 ianuarie 2022 10:51:54
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

int N, M;
vector<vector<int>> G;
vector<int> to, from;
vector<bool> u;
vector<int> sol;

void ReadData();
void Solve();
bool CheckEulerian();
void DFS(int node);

int main()
{
    ReadData();
    Solve();

    fin.close();
    fout.close();
    return 0;
}

void ReadData()
{
    fin >> N >> M;
    
    G = vector<vector<int>>(N + 1);
    to = from = vector<int>(M + 1);
    int x, y;
    for (int i = 1; i <= M; ++i)
    {
        fin >> x >> y;

        G[x].push_back(i);
        G[y].push_back(i);

        from[i] = x;
        to[i] = y;
    }
}

void Solve()
{
    u = vector<bool>(M + 1);

    bool ok = CheckEulerian();

    if (ok)
        DFS(1);
    
    // for (int x : sol)
    //     fout << x << ' ';

    sol.pop_back();

    if (!ok || sol.size() != M)
        fout << -1 << '\n';
    else
    {
        for (int x : sol)
            fout << x << ' ';
    }
}

bool CheckEulerian()
{
    for (int i = 1; i <= N; ++i)
        if (G[i].size() % 2)
            return false;
    return true;
}

void DFS(int node)
{
    while (!G[node].empty())
    {
        int i = G[node].back();
        G[node].pop_back();

        if (u[i])
            continue;
        u[i] = true;

        int y = from[i] ^ to[i] ^ node;     // muchia 1 -> 3, from[i] = 1, to[i] = 3, node = 1
        // int y;
        // if (from[i] == node)
        //     y = to[i];
        // else
        //     y = from[i];
        DFS(y);
    }

    sol.push_back(node);
}