Cod sursa(job #1572984)

Utilizator ZanoxNonea Victor Zanox Data 19 ianuarie 2016 11:43:37
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 3.57 kb
#include <iostream>
#include <fstream>

using namespace std;

struct lst
{
    lst *prec[2],*urm[2];
    int id[2],sl;
};

struct nod
{
    int grad;
    lst *orig,*spot,*p,*ort;
}v[100002];

fstream f,g;

lst *elem,*buc;
    lst *prez;
int n,m,i,j,t;
lst *k,*l,*o;

void realoc()
{
    //cout<<elem->id[0]<<' '<<elem->id[1]<<'\n';
    //if(buc->prec[0]==v[i].p)cout<<"da";
    buc->prec[0]->urm[buc->prec[0]->id[1]==buc->id[0]]=buc->urm[0];
    buc->prec[1]->urm[buc->prec[1]->id[1]==buc->id[1]]=buc->urm[1];
    buc->urm[0]->prec[buc->urm[0]->id[1]==buc->id[0]]=buc->prec[0];
    buc->urm[1]->prec[buc->urm[1]->id[1]==buc->id[1]]=buc->prec[1];

    buc->prec[0]=elem;
    buc->urm[0]=elem->urm[0];
    elem->urm[0]->prec[0]=buc;
    elem->urm[0]=buc;

    elem=buc;
    //if(v[buc->id[buc->id[0]!=i]].p->urm[0]==buc)cout<<"da";
}

void inaintare()
{
    buc=v[i].p->urm[0];
    //cout<<buc->id[0]<<' '<<buc->id[1]<<'\n';
    //if(v[i].grad>-300)cout<<i<<" are grad "<<v[i].grad<<'\n';
    if(v[buc->id[0]].spot==NULL)
    {
        v[buc->id[0]].spot=new lst;
        v[buc->id[0]].spot->prec[0]=prez->prec[0];
        v[buc->id[0]].spot->urm[0]=prez;
        prez->prec[0]->urm[0]=v[buc->id[0]].spot;
        prez->prec[0]=v[buc->id[0]].spot;
        v[buc->id[0]].spot->id[0]=buc->id[0];
    }
    if(v[buc->id[1]].spot==NULL)
    {
        v[buc->id[1]].spot=new lst;
        v[buc->id[1]].spot->prec[0]=prez->prec[0];
        v[buc->id[1]].spot->urm[0]=prez;
        prez->prec[0]->urm[0]=v[buc->id[1]].spot;
        prez->prec[0]=v[buc->id[1]].spot;
        v[buc->id[1]].spot->id[0]=buc->id[1];
    }

    v[buc->id[0]].grad--;
    v[buc->id[1]].grad--;



    if(v[buc->id[0]].grad==0)
    {
        v[buc->id[0]].spot->prec[0]->urm[0]=v[buc->id[0]].spot->urm[0];
        v[buc->id[0]].spot->urm[0]->prec[0]=v[buc->id[0]].spot->prec[0];
        v[buc->id[0]].spot=NULL;
    }
    if(v[buc->id[1]].grad==0)
    {
        v[buc->id[1]].spot->prec[0]->urm[0]=v[buc->id[1]].spot->urm[0];
        v[buc->id[1]].spot->urm[0]->prec[0]=v[buc->id[1]].spot->prec[0];
        v[buc->id[1]].spot=NULL;
    }

    realoc();
    elem=buc;
    i=elem->id[i==elem->id[0]];
    elem->sl=i;
    v[i].ort=elem;
}

int main()
{
    f.open("ciclueuler.in",ios_base::in);
    g.open("ciclueuler.out",ios_base::out);
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        v[i].p=new lst;
        v[i].p->urm[0]=v[i].p;
        v[i].p->prec[0]=v[i].p;
        v[i].p->id[0]=i;
        v[i].p->id[1]=0;
    }
    for(i=1;i<=m;i++)
    {
        elem=new lst;
        f>>elem->id[0]>>elem->id[1];

        v[elem->id[0]].p->prec[0]->urm[elem->id[0]==v[elem->id[0]].p->prec[0]->id[1]]=elem;
        elem->urm[0]=v[elem->id[0]].p;
        elem->prec[0]=v[elem->id[0]].p->prec[0];
        v[elem->id[0]].p->prec[0]=elem;

        v[elem->id[1]].p->prec[0]->urm[elem->id[1]==v[elem->id[1]].p->prec[0]->id[1]]=elem;
        elem->urm[1]=v[elem->id[1]].p;
        elem->prec[1]=v[elem->id[1]].p->prec[0];
        v[elem->id[1]].p->prec[0]=elem;


        v[elem->id[0]].grad++;
        v[elem->id[1]].grad++;
    }

    prez=new lst;
    prez->urm[0]=prez;
    prez->prec[0]=prez;

    lst *sol=new lst;
    sol->urm[0]=sol;
    sol->prec[0]=sol;

    i=1;
    elem=sol;
    inaintare();
    while(i!=1)inaintare();

    while(prez->urm[0]!=prez)
    {
    j=prez->urm[0]->id[0];
    elem=v[j].ort;
    i=j;
    inaintare();
    while(i!=j)inaintare();
    }

    for(elem=sol->urm[0];elem!=sol;elem=elem->urm[0])g<<elem->sl<<' ';
}