Cod sursa(job #3202774)

Utilizator CezarHutanuCezar Hutanu CezarHutanu Data 12 februarie 2024 11:30:39
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 kb
#include <fstream>
#include <vector>
#include <stack>
#define NMAX 100002
#define MMAX 500002

using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

struct varf
{
    int x, nr;
};
//x este varful adiacent, nr este numarul muchiei corespunzatoare
int n, m;
vector<varf> G[NMAX];
bool uz[MMAX];
//uz[i]=1 daca muchia cu numarul de ordine i a fost utilizata pe ciclu
int d[NMAX];
stack<int> S;
void citire();
int grade_pare();
void euler(int start);
int main()
{
    int start, eulerian, i;
    citire();
    if (!(start=grade_pare()))
        fout<<-1<<'\n';
    else
    {
        euler(start);
        eulerian=1;
        for (i=1; i<=m; i++)
            if (!uz[i]) eulerian=0;
        if (!eulerian)
        {
            fout.close();
            fout.open("ciclueeuler.out");
            fout<<-1<<'\n';
        }
    }
    fout.close();
    return 0;
}

void citire()
{
    varf vf;
    int i, x, y;
    fin>>n>>m;
    for (i=1; i<=m; i++)
    {
        fin>>x>>y;
        //y intra in lista de adiacenta a lui x
        vf.x=y;
        vf.nr=i;
        G[x].push_back(vf);
        //x intra in lista de adiacenta a lui y
        vf.x=x;
        vf.nr=i;
        G[y].push_back(vf);
        d[x]++;
        d[y]++;
    }
}

int grade_pare()
//returneaza 0 daca nu toate gradele sunt pare
//daca gradele sunt toate pare returneaza indicele unui varf care nu este izolat
{
    int i, start;
    for (i=1; i<=n; i++)
    {
        if (d[i]%2) return 0;
        if (d[i]) start=i;
    }
    return start;
}

void euler(int vf) {
    while (!G[vf].empty()) { // Continuăm să parcurgem cât timp există muchii nevizitate
        varf vfad = G[vf].back(); // Luăm ultima muchie adiacentă pentru a evita modificarea iterat.
        G[vf].pop_back(); // Eliminăm muchia din lista de adiacență pentru a nu o reutiliza

        if (!uz[vfad.nr]) { // Verificăm dacă muchia nu a fost vizitată
            uz[vfad.nr] = true; // Marcăm muchia ca vizitată
            euler(vfad.x); // Apel recursiv pentru nodul adiacent
        }
    }
    fout << vf << ' '; // Scriem nodul în fișier după ce am vizitat toate muchiile sale
}