Cod sursa(job #2663174)

Utilizator Rares31100Popa Rares Rares31100 Data 25 octombrie 2020 15:12:32
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 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], kpozitie[500002], pozs, lista[500002], pozl;

void dfsIter()
{
    stiva[++pozs] = 1;
    kpozitie[pozs] = last[1];
    
    while(pozs)
    {
        bool ok = 0;
        
        for(int k = kpozitie[pozs]; k; k = urm[k])
            if(viz[k/2] == 0)
            {
                viz[k/2] = 1;
                kpozitie[pozs] = urm[k];
                stiva[++pozs] = vf[k];
                kpozitie[pozs] = last[vf[k]];
                ok = 1;
                break;
            }
            
        if(ok == 0)
            lista[++pozl] = stiva[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;
}