Cod sursa(job #1180572)

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

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()
{
    freopen ("ciclueuler.in","r",stdin);
    freopen ("ciclueuler.out","w",stdout);

        scanf("%d%d", &n,&m);

        for (int i=1;i<=m;++i)
        {
            scanf("%d%d", &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)
            {

                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;
                        int v=p->nrm;
                        sters[v]=1;
                        if (mc[v][0]==lista[init])
                        {
                            ++init;
                            lista[init]=mc[v][1];
                            nrnod[mc[v][1]]--;
                            nrnod[mc[v][0]]--;
                        }else
                        {
                            ++init;
                            lista[init]=mc[v][0];
                            nrnod[mc[v][1]]--;
                            nrnod[mc[v][0]]--;
                        }
                    }
                }

                for (int i=1;i<sol[0];++i) printf("%d ", sol[i]);

            }else printf("-1\n");

        }else printf("-1\n");
    return 0;
}