Cod sursa(job #3202729)

Utilizator ionut.panaitePanaite Ionut-Cristian ionut.panaite Data 12 februarie 2024 11:08:55
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 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 vf adiacent iar nr e nr muchiei corespunzatoare
int n, m;
vector<varf> G[NMAX];
bool uz[NMAX];
///uz[i]=1 daca muchia cu nr 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("ciclueulerian.out");
            fout<<-1<<'\n';
        }
    }
    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()
{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 start)
{varf vfad;
int vf;
    S.push(start);// fout<<start;
    while(!S.empty())
    {
       vf=S.top();//S.pop;
       ///aleg un vf adiacent cu vf
       if(!G[vf].empty())
       {
           vfad=G[vf][G[vf].size()-1];
           if(!uz[vfad.nr])
           {
               uz[vfad.nr]=1;
               S.push(vfad.x);
           }
           G[vf].pop_back();
       }
       else {fout<<' '<<vf;S.pop();}
    }
}