Cod sursa(job #2550299)

Utilizator Rares31100Popa Rares Rares31100 Data 18 februarie 2020 18:12:18
Problema Ciclu Eulerian Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 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;
}

void DFS(int nod)
{
    for(int k=last[nod];k;k=urm[k])
        if(!viz[ ind[k] ])
        {
            int poz=ind[k];
            viz[ ind[k] ]=1;

            if(muchie[poz].F==nod)
                DFS(muchie[poz].S);
            else
                DFS(muchie[poz].F);
        }

    sol[++t]=nod;
}

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;
    }

    DFS(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;
}