Cod sursa(job #2525958)

Utilizator zimbabueMariana Rusu zimbabue Data 18 ianuarie 2020 09:36:59
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include<fstream>
using namespace std;
#define Nmax 100001
#define ss 500001
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n,m, grad[Nmax];
struct nod
{
    int info;
    nod *urm;
};
nod *prim[Nmax];
void insert(int x, int y)
{
    nod *p,*q;
    grad[x]++;
    grad[y]++;
    p=new nod;
    p->info=y;
    p->urm=prim[x];
    prim[x]=p;
    q=new nod;
    q->info=x;
    q->urm=prim[y];
    prim[y]=q;
}
void elim(int x, int y)  //elimin muchia x,y
{
// sterg prim[x]
    nod *q;
    q=prim[x];
    prim[x]=prim[x]->urm;
    delete(q);

    nod *p,*r;
    if(prim[y]->info == x)
    {
        p=prim[y];
        prim[y]=prim[y]->urm;
        delete(p);
    }
    else

        for(r=prim[y]; r->urm; r=r->urm)

            if(r->urm->info == x)
            {
                p=r->urm;
                r->urm = r->urm->urm;
                delete(p);
                break;
            }
}
void euler()
{
    int x,vf, st[ss], sol[ss],k=0;
    nod *q;
    vf=0;
    st[++vf]=1;
    while(vf)
    {
        x=st[vf];
        if(prim[x]!=NULL)
        {
            st[++vf]=prim[x]->info;
            elim(x, prim[x]->info);
        }
        else  sol[++k]=st[vf--];
    }
    for(int i=1; i<k; i++) g<<sol[i]<<" ";

}
int check()
{
    int i;
    for(i=1; i<=n; i++) if(grad[i]%2==1) return 0;
    return 1;
}
void read()
{
    f>>n>>m;
    int x,y;
    while(m--)
    {
        f>>x>>y;
        insert(x,y);
    }
}

int main()
{
    read();
    if(check()==0) g<<-1;
    else euler();
    return 0;
}