Cod sursa(job #2173705)

Utilizator NannyiMaslinca Alecsandru Mihai Nannyi Data 15 martie 2018 23:51:16
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
#define nmax 100005
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

vector<pair<int,int>>Q[nmax];
vector<int>stk,result;

int n,m,grad[nmax];
bool instk[nmax*5];

void read()
{
    f>>n>>m;
    for (int i=1; i<=m; ++i)
    {
        int e1,e2;
        f>>e1>>e2;
        Q[e1].push_back({e2,i});
        Q[e2].push_back({e1,i});
        ++grad[e1];
        ++grad[e2];
    }
}

void euler(int nod)
{
    while (Q[nod].size()&&instk[Q[nod].back().second])
    {
        Q[nod].pop_back();
    }
    if (Q[nod].empty())
        return;
    instk[Q[nod].back().second]=true;
    stk.push_back(Q[nod].back().first);
    euler(Q[nod].back().first);
}

void solve()
{
    for (int i=1; i<=n; ++i)
        if (grad[i]&1)
        {
            g<<-1;
            return;
        }
    euler(1);
    reverse(stk.begin(),stk.end());
    for (auto w:stk)
        g<<w<<' ';
}

int main()
{
    read();
    solve();
    return 0;
}