Cod sursa(job #2550343)

Utilizator Rares31100Popa Rares Rares31100 Data 18 februarie 2020 18:52:39
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>
#define F first
#define S second

using namespace std;

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

int n,m;
int ind[1000001],urm[1000001],last[100001],nr;
pair <int,int> muchie[500001];
bitset <500001> viz;
int sol[500002],t;

int grad[100001];

void adauga(int nod,int poz)
{
    ind[++nr]=poz;
    urm[nr]=last[nod];
    last[nod]=nr;
}

int stiva[500002],vf;

void Euler(int nod)
{
    stiva[++vf]=1;

    while(vf)
    {
        int nod=stiva[vf];

        while(last[nod] && viz[ ind[ last[nod] ] ])
            last[nod]=urm[ last[nod] ];

        if(!last[nod])
        {
            sol[++t]=nod;
            vf--;
        }
        else
        {
            int poz=ind[ last[nod] ];
            viz[poz]=1;

            if(muchie[poz].F==nod)
                stiva[++vf]=muchie[poz].S;
            else
                stiva[++vf]=muchie[poz].F;
        }
    }

}

bool gradPar()
{
    for(int i=1;i<=n;i++)
        if(grad[i]%2)
            return false;

    return true;
}

int main()
{
    in>>n>>m;

    for(int i=1;i<=m;i++)
    {
        in>>muchie[i].F>>muchie[i].S;

        grad[ muchie[i].F ]++;
        grad[ muchie[i].S ]++;

        adauga(muchie[i].F,i);
        adauga(muchie[i].S,i);
    }

    if( gradPar()==false )
    {
        out<<-1;
        return 0;
    }

    Euler(1);

    for(int i=1;i<=m;i++)
        if(!viz[i])
        {
            out<<-1;
            return 0;
        }

    for(int i=1;i<=t-1;i++)
        out<<sol[i]<<' ';

    return 0;
}