Cod sursa(job #876510)

Utilizator lianaliana tucar liana Data 11 februarie 2013 21:09:07
Problema Ciclu Eulerian Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include<stdio.h>
#include<list>
#include<algorithm>
using namespace std;
#define nmax 100005
struct element{long t, n;};
long a, b, i, j, n, m, gr[nmax];
bool ok, viz[nmax];
list <element> ma[nmax];
element el;

void citire()
{
    scanf("%ld %ld",&n,&m);
    for (i=1;i<=m;i++)
    {
        scanf("%ld %ld",&a,&b);
        el.t=0; el.n=b;     ma[a].push_back(el);
        el.t=0; el.n=a;     ma[b].push_back(el);
        gr[a]++;    gr[b]++;
    }
}

void dfs(long nod)
{
    list <element> ::iterator it, it1;
    element el;
    viz[nod]=1;
    for (it=ma[nod].begin();it!=ma[nod].end();it++)
        if (!viz[(*it).n])
        {
            el=*it;
            el.t=1;
            dfs(el.n);
            for (it1=ma[el.n].begin();it1!=ma[el.n].end();it1++)
                if ((*it1).n==nod)
                {   (*it1).t=1;    break;     }
        }
        else
            if ((*it).t==0)
                (*it).t=-1;
}

void verificare()
{
    ok=1;
    for (i=1;i<=n;i++)
        ok=ok&&(gr[i]%2==0)&&(viz[i]);
    if (!ok)
        printf("-1\n");
}

bool cmp(element a, element b)
{    return (a.t<b.t);  }

void parcurgere(long nod)
{
    list <element> ::iterator it;
    element el;
    printf("%ld ",nod);
    while (ma[nod].size())
    {
        el=ma[nod].front(); ma[nod].pop_front();
        for (it=ma[el.n].begin();it!=ma[el.n].end();it++)
            if ((*it).n==nod)
            {   ma[el.n].erase(it);    break;     }
        parcurgere(el.n);
    }
}

void rezolvare()
{
    for (i=1;i<=n;i++)
        ma[i].sort(cmp);
    parcurgere(1);
}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    citire();
    dfs(1);
    verificare();
    if (ok)
        rezolvare();
    return 0;
}