Cod sursa(job #2128345)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 11 februarie 2018 17:26:10
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define  NMAX 1000500
#define MMAX 2000000

using namespace std;

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

struct elem{
    int val;
    elem *urm;
}*v[NMAX];

int gradNod[NMAX];
int cicluEuler[NMAX],lg;
int n, m;

void citire(){
    in >> n >> m;
    for(int i = 1; i <= m; i++){
        int x, y;
        in >> x >> y;

        gradNod[x]++;
        gradNod[y]++;

        elem * deAdaugat = new elem;
        deAdaugat -> val = y;
        deAdaugat -> urm = v[x];
        v[x] = deAdaugat;
        if(x != y){
            elem * deAdaugat2 = new elem;
            deAdaugat2 -> val = x;
            deAdaugat2 -> urm = v[y];
            v[y] = deAdaugat2;
        }
    }
}

bool validareGrafEulerian(){
        for(int i = 1; i <= n; i++){
            if( gradNod[i]%2 == 1){
                return false;
            }
        }
    return true;
};

void stergereMuchie(int a, int b){
    elem * parcurg = v[a];
    if(parcurg -> val == b){
        parcurg = parcurg -> urm;
        v[a] = parcurg;
        return;
    }
    while(parcurg -> urm != NULL){
        if(parcurg -> urm -> val == b){
            parcurg -> urm = parcurg -> urm -> urm;
            break;
        }else{
            parcurg = parcurg -> urm;
        }
    }

}

void generareCiclu(){
    int stiva[MMAX], vfStiva;
    vfStiva = 1;
    stiva[1] = 1;
    while(vfStiva != 0){
        int elemVarf = stiva[vfStiva];
        elem *parcurg = v[elemVarf];
        bool ok = false;
        if(parcurg != NULL){
            stiva[++vfStiva] = parcurg -> val;
            stergereMuchie(elemVarf, parcurg -> val);
            if(parcurg -> val != elemVarf){
                stergereMuchie(parcurg -> val, elemVarf);
            }
            ok = true;
        }
        if(ok == false){
            cicluEuler[++lg] = elemVarf;
            vfStiva--;
        }
    }
}

void afisare(){
    for(int i = 1; i < lg; i++){
        out << cicluEuler[i] << ' ';
    }
}

int main() {
    citire();
    if(validareGrafEulerian() == false){
        out << "-1";
    }
    generareCiclu();
    afisare();
    return 0;
}