Cod sursa(job #1364299)

Utilizator firutibogdanFiruti Bogdan-Cristian firutibogdan Data 27 februarie 2015 16:39:19
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 3.9 kb
#include<fstream>
using namespace std;
struct nod
{
    int x;
    nod *st,*dr,*adr;
};
nod *p,*PR[100002],*UL[100002];

void elimin1(nod *x,int v1)
{
    if(x->st==0)
    {
        PR[v1]=PR[v1]->dr;
        if(PR[v1]==0)
        {
            UL[v1]=0;
        }
        else
        {
            PR[v1]->st=0;
        }
        delete x;
    }
    else
    {
        if(x->dr==0)
        {
            UL[v1]=UL[v1]->st;
            if(UL[v1]==0)
            {
                PR[v1]=0;
            }
            else
            {
                UL[v1]->dr=0;
            }
            delete x;
        }
        else
        {
            ((x->st)->dr)=x->dr;
            ((x->dr)->st)=x->st;
            delete x;
        }
    }
}
void elimin(nod *p,nod *q)
{
    int v1,v2;
    v1=(p->adr)->x;
    v2=(q->adr)->x;
    elimin1(p,v1);
    elimin1(q,v2);
}
int n,m,x,y,i,j,deg1[100002],deg[100002],m1,ok,ncc,ndd,cc[600009],dd[600009];
int main()
{
     ifstream fin("ciclueuler.in");
    ofstream fout("ciclueuler.out");
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        if(x==y)
        {
            deg1[x]++;
        }
        else
        {
            deg[x]++;
            deg[y]++;
            p=new nod;
            p->x=y;
            p->dr=0;
            p->st=UL[x];
            if(PR[x]==0)
            {
                PR[x]=p;
                UL[x]=p;
            }
            else
            {
                UL[x]->dr=p;
                UL[x]=p;
            }
            p=new nod;
            p->x=x;
            p->dr=0;
            p->st=UL[y];
            if(PR[y]==0)
            {
                PR[y]=p;
                UL[y]=p;
            }
            else
            {
                UL[y]->dr=p;
                UL[y]=p;
            }
            UL[x]->adr=UL[y];
            UL[y]->adr=UL[x];
        }
    }
    m1=0;
    for(i=1;i<=n;i++)
    {
        m1=m1+deg[i];
    }
    m1=m1/2;
    ok=1;
    for(i=1;i<=n;i++)
    {
        if(deg[i]!=0)
        {
            break;
        }
    }
    if(i>n)
    {
        ok=0;
    }
    else
    {
        cc[1]=i;
        ncc++;
        do
        {
            p=PR[cc[ncc]];
            if(p==0)
            {
                ok=0;
                break;
            }
            else
            {
                deg[cc[ncc]]--;
                deg[p->x]--;
                m1--;
                cc[ncc+1]=p->x;
                ncc++;
                elimin(p->adr,p);
            }
        }while(cc[ncc]!=cc[1]);
        while(m1!=0 && ok==1)
        {
            for(i=1;i<=ncc;i++)
            {
                if(deg[cc[i]]!=0)
                {
                    break;
                }
            }
            if(i>ncc)
            {
                ok=0;
                break;
            }
            else
            {
                dd[1]=cc[i];
                ndd=1;
                do
                {
                    p=PR[dd[ndd]];
                    deg[dd[ndd]]--;
                    deg[p->x]--;
                    m1--;
                    ndd++;
                    dd[ndd]=p->x;
                    elimin(p->adr,p);
                }while(dd[ndd]!=dd[1]);
            }
            for(j=ncc;j>=i+1;j--)
            {
                cc[j+ndd-1]=cc[j];
            }
            for(j=2;j<=ndd;j++)
            {
                cc[i+j-1]=dd[j];
            }
            ncc=ncc+ndd-1;
        }
    }
    if(ok==0)
    {
        fout<<"-1";
    }
    else
    {
        for(i=1;i<ncc;i++)
        {
            fout<<cc[i]<<" ";
            while(deg1[cc[i]]!=0)
            {
                fout<<cc[i]<<" ";
                deg1[cc[i]]--;
            }
        }
    }
    fin.close();
    fout.close();
    return 0;
}