Cod sursa(job #2663178)

Utilizator Rares31100Popa Rares Rares31100 Data 25 octombrie 2020 15:17:41
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
int n, m, vf[1000002], urm[1000002], last[100001], pozb = 1, grad[100001];
bitset <500001> viz;

void adauga(int from, int to)
{
    vf[++pozb] = to;
    urm[pozb] = last[from];
    last[from] = pozb;
}

int stiva[500002], pozs, lista[500002], pozl;

void dfsIter()
{
    stiva[++pozs] = 1;
    
    while(pozs)
    {
        int nod = stiva[pozs];
        bool ok = 0;
        
        for(; last[nod]; last[nod] = urm[last[nod]])
            if(viz[last[nod]/2] == 0)
            {
                viz[last[nod]/2] = 1;
                stiva[++pozs] = vf[last[nod]];
                ok = 1;
                break;
            }
            
        if(ok == 0)
        {
            lista[++pozl] = nod;
            pozs--;
        }
    }
}

int main()
{
    in >> n >> m;
    
    for(int i, j, k = 1; k <= m; k++)
    {
        in >> i >> j;
        adauga(i, j);
        adauga(j, i);
        grad[i]++;
        grad[j]++;
    }
    
    for(int i = 1; i <= n; i++)
        if(grad[i] % 2)
        {
            out << -1;
            return 0;
        }
    
    dfsIter();
    
    for(int i = 1; i < pozl; i++)
        out << lista[i] << ' ';
        
    return 0;
}