Cod sursa(job #901763)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 1 martie 2013 11:38:04
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
#include<fstream>
#include<iostream>
#include<list>
#define NMAX 100010

using namespace std;

list<int> a[NMAX];
int n, m, vz[NMAX], d[NMAX];

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

struct nod
{
    int x;
    nod *leg;
}*prim, *ultim, *p, *u, *cap, *w;


void Citeste()
{
    int x, y, i;

    f>>n>>m;

    for (i=1; i<=m; ++i)
    {
        f>>x>>y;
        a[x].push_back(y); ++d[x];
        a[y].push_back(x); ++d[y];
    }
}

void DFS(int nod)
{
    list<int> :: iterator it;

    vz[nod]=1;

    for (it=a[nod].begin(); it!=a[nod].end(); ++it)
        if (!vz[*it]) DFS(*it);
}

int bun()
{
    int i;

    DFS(1);

    for (i=1; i<=n; ++i)
        if (!vz[i]  || d[i]%2==1) return 0;

    return 1;
}

void Cauta(int nod, int cnod)
{
    int ap=0;

    list<int> :: iterator it;

    --d[nod];
    for (it=a[nod].begin(); it!=a[nod].end(); ++it)
        if (*it==cnod)
        {
            if ((cnod==nod && ap==1) || cnod!=nod )
            {
                --d[cnod];
                a[nod].erase(it);
                break;
            }
            else ap=1;
        }
}

void Ciclu(int primul)
{
    nod *q;
    int x=primul;
    list<int> :: iterator it;

    u=p=new nod;
    p->x=primul; p->leg=NULL;

    do
    {
        //cout<<u->x<<" "<<*a[u->x].begin();
        it=a[u->x].begin();

        q=new nod;
        q->x=*it; q->leg=NULL;
        u->leg=q;

        Cauta(*it, x);

        x=*it;

        a[u->x].erase(it);

        u=u->leg;

    }while (x!=primul);
}

void Insereaza()
{
    nod * tt;

    tt=w->leg;
    p=p->leg;
    w->leg=p;
    u->leg=tt;
}

void Construieste()
{
    Ciclu(1);
    prim=p; ultim=u;
    w=p;

    while (w!=NULL)
    {
        while (w!=NULL && !d[w->x]) w=w->leg;

        if (w!=NULL)
        {
            Ciclu(w->x);
            Insereaza();
            w=w->leg;
        }
    }
    while (prim->leg!=NULL)
    {
        g<<prim->x<<" ";
        prim=prim->leg;
    }
}

int main()
{
    Citeste();

    if (bun()) Construieste();
    else g<<"-1";
    f.close();
    g.close();
    return 0;
}