Cod sursa(job #903016)

Utilizator lianaliana tucar liana Data 1 martie 2013 18:04:17
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include<fstream>
#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;

ifstream fin ("ciclueuler.in");
ofstream fout ("ciclueuler.out");

void citire()
{
    fin>>n>>m;
    for (i=1; i<=m; i++)
    {
        fin>>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)
                fout<<nod<<' ';
            else
                break;
        }
    }
}

int main()
{
    citire();
    bfs();
    verificare();
    if (!ok)
        fout<<-1<<"\n";
    else
        rezolvare();
    return 0;
}