Cod sursa(job #1180564)

Utilizator t.g.g.tt.g.g.t t.g.g.t Data 30 aprilie 2014 19:11:20
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 4.59 kb
#include <fstream>

using namespace std;

struct cel
{
    int nrm;
    cel *adr;
};

typedef cel *lda1;

lda1 lda[100005];

int mc[500005][2],n,m,t,lista[500005],parc[100005],sol[500005],sters[500005],nrnod[100005];

bool e_conex()
{
    int init=1,ultim=1;
    lista[1]=1;
    while (init<=ultim)
    {
        for (lda1 p=lda[lista[init]];p!=NULL;p=p->adr)
        {
            if (mc[p->nrm][0]==lista[init])
            {
                if (parc[mc[p->nrm][1]]==0) { parc[mc[p->nrm][1]]=1; ++ultim; lista[ultim]=mc[p->nrm][1]; }
            }else
            {
                if (parc[mc[p->nrm][0]]==0) { parc[mc[p->nrm][0]]=1; ++ultim; lista[ultim]=mc[p->nrm][0]; }
            }
        }
        ++init;
    }

    for (int i=1;i<=n;++i) if (parc[i]==0) return false;
    return true;
}

int main()
{
    ifstream in ("ciclueuler.in");
    ofstream out ("ciclueuler.out");

        in>>n>>m;
        for (int i=0;i<=n;++i)
        {
            nrnod[i]=0;
            parc[i]=0;
            lda1 p=lda[i],v;
            while (p!=NULL)
            {
                v=p;
                p=p->adr;
                delete(v);
            }
            lda[i]=p;
        }
        for (int i=0;i<=m+3;++i)
        {
            mc[i][0]=0;
            mc[i][1]=0;
            lista[i]=0;
            sol[i]=0;
            sters[i]=0;
        }

        for (int i=1;i<=m;++i)
        {
            in>>mc[i][0]>>mc[i][1];
            nrnod[mc[i][0]]++;
            nrnod[mc[i][1]]++;
            lda1 p=new cel;
            p->nrm=i;
            p->adr=lda[mc[i][0]];
            lda[mc[i][0]]=p;
            p=new cel;
            p->nrm=i;
            p->adr=lda[mc[i][1]];
            lda[mc[i][1]]=p;
        }

        bool adr=e_conex();

        if (adr)
        {
            int v1=0,pos1=0,pos2=0;
            for (int i=1;i<=n;++i)
            {
                if (nrnod[i]&1==1)
                {
                    ++v1;
                    if (v1==1) pos1=i;
                    if (v1==2) pos2=i;
                }
            }

            if (v1==0 || v1==2)
            {

                if (v1==2)
                {
                    nrnod[pos1]++;
                    nrnod[pos2]++;
                    m++;
                    mc[m][0]=pos1;
                    mc[m][1]=pos2;
                    lda1 p=new cel;
                    p->nrm=m;
                    p->adr=lda[mc[m][0]];
                    lda[mc[m][0]]=p;
                    p=new cel;
                    p->nrm=m;
                    p->adr=lda[mc[m][1]];
                    lda[mc[m][1]]=p;
                }


                int init=1,ultim=1; lista[1]=1; sol[0]=0;

                while (init>0)
                {
                    if (nrnod[lista[init]]==0)
                    {
                        ++sol[0];
                        sol[sol[0]]=lista[init];
                        init--;
                    }else
                    {
                        lda1 p=lda[lista[init]];
                        while (sters[p->nrm]==1) p=p->adr;
                        sters[p->nrm]=1;
                        if (mc[p->nrm][0]==lista[init])
                        {
                            ++init;
                            lista[init]=mc[p->nrm][1];
                            nrnod[mc[p->nrm][1]]--;
                            nrnod[mc[p->nrm][0]]--;
                        }else
                        {
                            ++init;
                            lista[init]=mc[p->nrm][0];
                            nrnod[mc[p->nrm][1]]--;
                            nrnod[mc[p->nrm][0]]--;
                        }
                    }
                }

                int ruptura=0;
                for (int i=1;i<sol[0];++i)
                {
                    if (pos1==sol[i])
                    {
                        if (pos2==sol[i+1])
                        {
                            ruptura=i;
                        }
                    }
                    if (pos2==sol[i])
                    {
                        if (pos1==sol[i+1])
                        {
                            ruptura=i;
                        }
                    }
                }

                for (int i=ruptura+1;i<sol[0];++i) out<<sol[i]<<" ";
                for (int i=2;i<=ruptura;++i) out<<sol[i]<<" ";
                out<<"\n";

            }else out<<"-1\n";

        }else out<<"-1\n";

    in.close();
    out.close();
    return 0;
}