Cod sursa(job #2509396)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 14 decembrie 2019 10:47:59
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
#include <vector>
#include <stack>

#define MMAX 500005
#define NMAX 100005
using namespace std;

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

struct muchie{
    int x, y;
    bool vizmuchie=false;
};

muchie muchii[MMAX];
int n, m, nrizolat=0, nr;
int x, y, d[NMAX];
int viz_conex[NMAX];

stack<int> ciclu;
vector<int> graph[NMAX];

int verif_grad(){
    int ok=1;
    for(int i=1; i<=n; i++){
        if(d[i]%2 != 0 || (viz_conex[i]==0 && d[i]!=0))
            return 0;
    }
    return 1;
}

void euler(){  // graph[nod]
    ciclu.push(1);
    while(!ciclu.empty()){
        int x = ciclu.top(); // ultimul nod
        if(!graph[x].empty()){
            int ultim = graph[x].back(); // indicele ultimei muchii
            graph[x].pop_back();
            if(muchii[ultim].vizmuchie == false){
                int nod = (x==muchii[ultim].x)?muchii[ultim].y:muchii[ultim].x;
                ciclu.push(nod);
                muchii[ultim].vizmuchie = true;
            }
        }
        else {
            if(ciclu.size()>1)
                g<<x<<" ";
            ciclu.pop();
        }
    }

}

void parcurgere(int i){
    viz_conex[i] = 1;
    for(auto &v:graph[i]){
        int x = (i==muchii[v].x)?muchii[v].y:muchii[v].x;
        if(viz_conex[x] == 0){
            parcurgere(x);
        }

    }
}

int main()
{
//    freopen("ciclueuler.in", "r", stdin);
//    freopen("ciclueuler.out", "w", stdout);
//    scanf("%d %d", &n, &m);
    f>>n>>m;
    for(int i=1; i<=m; i++){
        f>>muchii[i].x>>muchii[i].y;
        graph[muchii[i].x].push_back(i);
        graph[muchii[i].y].push_back(i);
        d[muchii[i].x]++;
        d[muchii[i].y]++;
    }
    parcurgere(1);
    if(verif_grad() == 1){
        euler();
    }
    else g<<"-1";
    return 0;
}