Cod sursa(job #2345684)

Utilizator crion1999Anitei cristi crion1999 Data 16 februarie 2019 16:34:22
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
#include <algorithm>

#define NMAX 100005
#define MMAX 500005
using namespace std;
ifstream fi("ciclueuler.in");
ofstream fo("ciclueuler.out");

int N, M;

vector<pair<int, int>> graph[NMAX];
stack<int> s;
stack<int> rez;
bool availble[MMAX];
int grad[NMAX];
int visited[NMAX];

int main()
{
    fi >> N >> M;
    int a, b;
    int cod = 0;
    for(int i = 1; i <= M; ++i)
    {
        fi >> a >> b;
        ++cod;
        graph[a].push_back({b, cod});
        graph[b].push_back({a, cod});
        availble[cod] = 1;
        grad[a] ++;
        grad[b] ++;
    }

    for(int i = 1; i <= N; ++i)
        if(grad[i] % 2 == 1)
        {
            fo <<-1;
            return 0;
        }
    s.push(1);

    while(!s.empty())
    {
        int current =  s.top();
        bool canAdvance = false;
        for(auto& y:graph[current])
        {
            if(availble[y.second])
            {
                availble[y.second] = 0;
                s.push(y.first);
                canAdvance = true;
                break;
            }
        }

        if(!canAdvance)
        {
            rez.push(current);
            s.pop();
        }

    }

    for(int i = 1; i <= M; ++i)
    {
        fo << rez.top() << " ";
        rez.pop();
    }

}