Cod sursa(job #1970725)

Utilizator borcanirobertBorcani Robert borcanirobert Data 19 aprilie 2017 15:58:02
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
using namespace std;

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

using VI = vector<int>;
vector<VI> G;
VI to, from;
int N, M;
VI ans;

void Read();
void Euler();
void Write();

int main()
{
    Read();
    Euler();
    Write();

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

void Read()
{
    fin >> N >> M;
    G = vector<VI>(N + 1);
    to = from = VI(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);

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

void Euler()
{
    stack<int> st;
    for ( int i = 1; i <= N; ++i )
        if ( G[i].size() & 1 )
        {
            fout << "-1" << '\n';
            return;
        }

    vector<bool> used(M + 1);
    st.push(1);
    while ( !st.empty() )
    {
        int x = st.top();

        if ( !G[x].empty() )
        {
            int ind = G[x].back();
            G[x].pop_back();

            if ( !used[ind] )
            {
                used[ind] = true;
                int y = from[ind] ^ to[ind] ^ x;

                st.push(y);
            }
        }
        else
        {
            ans.push_back(x);
            st.pop();
        }
    }
}

void Write()
{
    for ( const int& x : ans )
        fout << x << ' ';
}