Cod sursa(job #2681333)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 5 decembrie 2020 11:45:45
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 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;
}muchii[MMAX];

vector<int>graph[NMAX];
stack<int>ciclu;
int n, m, viz[NMAX];
int d[NMAX];


void citire(){
    f>>n>>m;
    int x, y;
    for(int i=0; i<m; i++){
        f>>x>>y;
        muchii[i].x = x;
        muchii[i].y = y;
        graph[x].push_back(i);
        graph[y].push_back(i);
        d[x] ++;
        d[y] ++;
    }
}

void parcurgere(int vf){
    viz[vf] = 1;
    for(auto &m:graph[vf]){
        int nod = (muchii[m].x == vf)?muchii[m].y:muchii[m].x;
        if(viz[nod] == 0)
            parcurgere(nod);
    }
}

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

}

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

    }

}
int main()
{
    citire();
    parcurgere(1);
    if(verif() == 0){
        g<<"-1";
    }
    else euler();
    return 0;
}