Cod sursa(job #903006)

Utilizator lianaliana tucar liana Data 1 martie 2013 18:01:20
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include<stdio.h>
#include<list>
#include<stack>
using namespace std;
#define nmax 100005
long n, m, i, a, b, ac, urm, sf, nod, nraf, inc, el;
long gr[nmax], co[nmax];
bool viz[nmax], ok;
list <long> ma[nmax];
list <long> ::iterator it;
stack <long> st;

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

void bfs()
{
    co[1]=1; inc=sf=1;  viz[1]=1;
    while (inc<=sf)
    {
        el=co[inc]; inc++;
        for (it=ma[el].begin();it!=ma[el].end();it++)
            if (!viz[*it])
            {
                viz[*it]=1;
                co[++sf]=*it;
            }
    }
}

void verificare()
{
    ok=1;
    for (i=1; i<=n; i++)
        ok=ok&&(viz[i])&&(gr[i]%2==0);
}

void eliminare_muchie()
{
    ma[ac].erase(ma[ac].begin());
    for (it=ma[urm].begin(); it!=ma[urm].end(); it++)
        if (*it==ac)
        {
            ma[urm].erase(it);
            break;
        }
}

void extinde()
{
    ac=nod;
    while (1)
    {
        st.push(ac);
        if (ma[ac].size()==0)
            break;
        urm=*ma[ac].begin();
        eliminare_muchie();
        ac=urm;
    }
}

void rezolvare()
{
    st.push(1);
    while (st.size())
    {
        nod=st.top();
        st.pop();
        if (ma[nod].size())
            extinde();
        else
        {
            nraf++;
            if (nraf<=m)
                printf("%ld ",nod);
            else
                break;
        }
    }
}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    citire();
    bfs();
    verificare();
    if (!ok)
        printf("-1\n");
    else
        rezolvare();
    return 0;
}