Cod sursa(job #2849609)

Utilizator andreealeonteLeonte Andreea andreealeonte Data 15 februarie 2022 13:15:01
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
#include <vector>
#define NMAX 100002
#define MMAX 500002
using namespace std;

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

struct muchie
{
    int x, y;
    bool uz; ///daca muchia a fost sau nu folosita
};

int n, m, i;
muchie lm[MMAX];
vector <int> la[NMAX];
///la[x] contine indicii muchiilor care au ca extrem pe x
int s[MMAX];
int vf;
int sol[MMAX];
int poz;

void citire();
void detcicl();
void afis();
bool gpare();

int main()
{
    citire();
    if (!gpare())
    {
        cout<<-1<<endl;
        return 0;
    }
else
    detcicl();
    afis();
    return 0;
}


void citire()
{
    int i, x, y;

    cin>>n>>m;
    for (i=1; i<=m; i++)
    {
        cin>>x>>y;
        lm[i].x=x;
        lm[i].y=y;
        lm[i].uz=0;

        la[x].push_back(i);
        la[y].push_back(i);
    }
}


void detcicl()
{
    int crt, urm;

    s[1]=1;
    vf=1;
    while (vf)
    {
        crt=s[vf];
        if (la[crt].size()==0)
        {
            sol[++poz]=crt;
            vf--;
        }
        else
        {
            urm=la[crt].back();
            la[crt].pop_back();
            if (lm[urm].uz==0)
            {
                lm[urm].uz=1;
                if (lm[i].x==crt)
                    s[++vf]=lm[urm].y;
                else
                    s[++vf]=lm[urm].x;

            }
        }

    }
}

void afis()
{
    int i;

    if (poz-1!=m)
        cout<<-1<<endl;
    else
        for (i=1; i<=poz; i++)
            cout<<sol[i]<<' ';
    cout<<endl;
}


bool gpare()
{
    int i;

    for (i=1; i<=n; i++)
        if (la[i].size()%2)
            return 0;
    return 1;
}