Cod sursa(job #2849607)

Utilizator Humaru_AndreiHumaru Andrei Humaru_Andrei Data 15 februarie 2022 13:14:59
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <vector>
#define NMAX 100004
#define MMAX 500004
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
bool grade_pare();
void citire();
void cicluEulerian(int x);
void afisare();
struct muchie {
    int x,y;
    bool uz; ///uz va fi 1 daca muchia a fost deja folosita in ciclu, 0 altfel
};
muchie lm[MMAX];
vector <int> la[NMAX]; ///la[x] contine indiciele muchiilor care au ca extremitate pe x
int S[MMAX];
int sol[MMAX];
int nrm;
int n,m;
int poz;
int main()
{
    citire();
    if (!grade_pare()) {fout << - 1 << '\n'; return 0;}
    cicluEulerian(1);
    afisare();
    return 0;
}
void citire()
{int i,x,y;
    fin >> n >> m;
    for (i = 1; i <= m; i++)
    {
        fin >> x >> y;
        la[x].push_back(i);
        la[y].push_back(i);
        lm[i].x = x;
        lm[i].y = y;
    }
}
void cicluEulerian(int x)
{ int vf,crt;
    int urm;
    S[1] = x;
    vf = 1;
    while(vf > 0)
    {
        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) {
                lm[urm].uz = 1;
                if (lm[urm].x == crt)
                    S[++vf] = lm[urm].y;
                else S[++vf] = lm[urm].x;
            }
        }
    }
}
bool grade_pare()
{int i;
    for (i = 1; i <= n; i++)
        if (la[i].size() % 2) return 0;
    return 1;
}
void afisare()
{int i;
    if (poz - 1 != m) fout << -1 << '\n';
    else
        {for (i = 1; i < poz; i++)
        fout << sol[i] << " ";
    fout << '\n'; }
}