Cod sursa(job #1854374)

Utilizator ZanoxNonea Victor Zanox Data 22 ianuarie 2017 17:36:21
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <fstream>
#include <iostream>
#include <cstring>
#define hash_constant 982451653
#define scope 1000000
//982 451 653

using namespace std;

fstream f("ciclueuler.in",ios::in),g("ciclueuler.out",ios::out);

struct nod
{
    nod *next,*prev,*twin;
    int dest;
}*v[1000001],*p,*q,*sol,*prez,*d[1000001];

int i,j,n,m,card[1000001],a,b,t;

nod* add(nod *p)
{
    nod *q=new nod;
    q->prev=p->prev;
    q->next=p;
    p->prev->next=q;
    p->prev=q;
    return q;
}

void del(nod *a)
{
    a->prev->next=a->next;
    a->next->prev=a->prev;
    delete a;
}

void rev(nod *p)
{
    int i=p->dest;
    int j=i,k;
    p=p->next;
    nod *q,*r;
    while(card[i]>0)
    {
        k=v[j]->next->dest;
        card[j]--;card[k]--;
        q=v[j]->next;
        r=q->twin;
        del(q);
        del(r);
        if(card[j]==0&&d[j]!=NULL)del(d[j]);
        if(card[k]==0&&d[k]!=NULL)del(d[k]);
        q=add(p);
        q->dest=k;
        if(card[k]>0)
        {
            if(d[k]==NULL){d[k]=add(prez);d[k]->dest=k;}
            d[k]->twin=q;
        }
        j=k;
    }
}

int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        v[i]=new nod;
        v[i]->next=v[i]->prev=v[i];
        v[i]->twin=NULL;
        v[i]->dest=0;
        d[i]=NULL;
    }
    for(i=0;i<m;i++)
    {
        f>>a>>b;
        card[a]++;card[b]++;
        p=add(v[a]);
        q=add(v[b]);
        p->dest=b;
        q->dest=a;
        p->twin=q;
        q->twin=p;
    }
    for(i=1,t=1;i<=n;i++)if(card[i]%2==1)t=0;
    if(t==0){g<<-1;return 0;}

    sol=new nod;
    sol->next=sol->prev=sol;
    sol->twin=NULL;
    sol->dest=0;

    prez=new nod;
    prez->next=prez->prev=prez;
    prez->twin=NULL;
    prez->dest=0;

    p=add(sol);
    p->dest=1;
    if(card[1]>0)
    {
        q=add(prez);
        q->dest=1;
        d[1]=q;
        q->twin=p;
    }
    while(prez->next!=prez)rev(prez->next->twin);
    for(p=sol->next;p!=sol->prev;p=p->next)g<<p->dest<<' ';
}