Cod sursa(job #1276646)

Utilizator roxyroxy2011Luca Roxana roxyroxy2011 Data 26 noiembrie 2014 17:53:51
Problema Ciclu Eulerian Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <fstream>
#include <stdlib.h>
#define NMAX 100004

using namespace std;

ifstream cin("ciclueuler.in");
ofstream cout("ciclueuler.out");

struct nod{int nr;nod*urm;};
typedef nod*Lista;
Lista p,lis[NMAX],prim;int n,m,gr[NMAX];

void read();
void inserare(Lista&,int);
void solve();
void write();
void determina_ciclu(Lista,Lista&);
void stergere(Lista&,int);

int main()
{
    read();
    solve();
    write();
    cin.close();cout.close();
    return 0;
}

void read()
{
    int i,x,y;
    cin>>n>>m;
    for (i=1;i<=n;i++) lis[i]=NULL;
    for (i=1;i<=m;i++)
    {
        cin>>x>>y;
        inserare(lis[x],y);gr[x]++;
        inserare(lis[y],x);gr[y]++;
    }
    for (i=1;i<=n;i++)
        if (gr[i]%2==1)
    {
        cout<<"-1\n";
        exit(0);
    }
}

void inserare(Lista&prim,int nr)
{
    Lista aux;
    aux=new nod;
    aux->nr=nr;
    aux->urm=prim;
    prim=aux;
}

void solve()
{
    Lista p1,u1;int nr;
    prim=new nod;
    prim->nr=1;
    prim->urm=NULL;

    p1=new nod;
    p1->nr=1;
    p1->urm=NULL;
    prim->urm=p1;

    p=prim;
    while (p!=NULL)
    {
        p1=new nod;
        p1->nr=p->nr;
        p1->urm=NULL;
        u1=NULL;
        determina_ciclu(p1,u1);

        if (u1!=NULL){
            u1->urm=p->urm;
            p->urm=p1->urm;
        }
        p=p->urm;
    }
}

void stergere(Lista&prim,int nr)
{
    Lista p,aux;
    if (prim->nr==nr)
    {
        aux=prim;
        prim=prim->urm;
        delete aux;
        return;
    }
    p=prim;
    while (p->urm!=NULL && p->urm->nr!=nr) p=p->urm;
    aux=p->urm;
    p->urm=p->urm->urm;
    delete aux;
}

void write()
{
    while (prim->urm!=NULL)
    {
        cout<<prim->nr<<' ';
        prim=prim->urm;
    }
}

void determina_ciclu(Lista p,Lista& u1)
{
    Lista u=p,aux;int nr;
    while (lis[u->nr]!=NULL)
    {
        nr=lis[u->nr]->nr;
        stergere(lis[nr],u->nr);
        stergere(lis[u->nr],nr);
        aux=new nod;
        aux->nr=nr;
        aux->urm=NULL;
        u->urm=aux;
        u1=u;
        u=aux;
    }
}