Cod sursa(job #2861932)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 4 martie 2022 18:30:21
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
#include <climits>
#include <cstring>
#include <algorithm>
#include <string>

#define MOD 1999999973
#define EPSILON 0.001

using namespace std ;

ifstream cin ("ciclueuler.in") ;
ofstream cout ("ciclueuler.out") ;

int n ;

struct fruct
{
    int a ;

    int frate = 0 ;
};

vector<fruct> m[100009] ;

vector<int> rez ;

void simplifica(int nod)
{
    while(m[nod].size() && m[nod].back().a == -1)m[nod].pop_back() ;
}

void stergemuchia(int nod)
{
    m[m[nod].back().a][m[nod].back().frate].a = -1 ;
    m[nod].back().a = -1 ;
}

void fil(int nod)
{
    /// poate trece prin acelasi nod de doua ori
    /// daca mai are ceva in m[nod].size() atunci il abordam

    simplifica(nod) ;

    if(!m[nod].size())return ;

    int nextnod = m[nod].back().a ;

    ///cout << nod << " " << nextnod << endl ;

    stergemuchia(nod) ;

    fil(nextnod) ;

    rez.push_back(nod) ;
}

int main()
{
    /*
    int *p ;

    int a = 11 ;

    p = &a ;

    (*p) = 12 ;

    cout << a ;

    return 0 ;
*/
    int q ;

    cin >> n >> q ;

    /// vreau sa fie usor pentru mine sa scot o muchie din sistem

    for(int f = 1, a, b ; f <= q ; f ++)
    {
        cin >> a >> b ;

        fruct x, y ;

        x.a = b ;
        y.a = a ;

        x.frate = m[b].size() ;
        y.frate = m[a].size() ;

        m[a].push_back(x) ;

        m[b].push_back(y) ;
    }

    fil(1) ;

    if(rez.size() == q)
    {
        for(int f = 0 ; f < q ; f ++)
            cout << rez[f] << " " ;
    }
    else cout << -1 ;

    return 0 ;
}