Cod sursa(job #1819239)

Utilizator alexandru822Bosinta Alexandru alexandru822 Data 30 noiembrie 2016 13:54:29
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

ofstream out("ciclueuler.out");
ifstream in("Ciclueuler.in");

const int MAX_N = 100000;

vector<int> Neighbour[MAX_N + 1];
int degree[MAX_N + 1];

void Euler(int x)
{
    out << x << " ";
    for(int y : Neighbour[x])
    {
        if(degree[y] >= 2)
        {
            auto it1 = find(Neighbour[x].begin(), Neighbour[x].end(), y);
            if(it1 != Neighbour[x].end())
                Neighbour[x].erase(it1);
            auto it2 = find(Neighbour[y].begin(), Neighbour[y].end(), x);
            if(it2 != Neighbour[y].end())
                Neighbour[y].erase(it2);
            degree[x] --;
            degree[y] --;
            Euler(y);
        }
    }
}

int main()
{
    int N, M, i, a, b;
    in >> N >> M;

    /* read */
    for(i = 1; i <= M; i++)
    {
        in >> a >> b;
        Neighbour[a].push_back(b);
        Neighbour[b].push_back(a);
        degree[a] ++;
        degree[b] ++;
    }

    /* test for existance of cycle */
    for(i = 1; i <= N; i++)
        if(degree[i] %2 != 0)
        {
            out << -1;
            return 0;
        }

    Euler(1);
    return 0;
}