Cod sursa(job #1124289)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 26 februarie 2014 11:58:49
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include<fstream>
#include<list>
#define NMAX 100010

using namespace std;

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

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

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

    f>>n>>m;
    for (i=1; i<=m; ++i)
    {
        f>>x>>y;
        if (x==y) ++bucla[x];
        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])
        {
            tata[*it]=nod;
            DFS(*it);
            b[nod].push_back(*it);
            b[*it].push_back(nod);
        }
        else
        {
            if ((*it)==nod) b[nod].push_front(*it);
            else
                if (tata[nod]!=(*it))
                {
                    b[nod].push_front(*it);
                    b[*it].push_front(nod);
                }
        }
}

bool solutie()
{
    int i;
    for (i=1; i<=n; ++i)
    {
        if (d[i]%2==1 || (d[i] && !vz[i])) return 0;
        vz[i]=0;
    }
    return 1;
}

void Sterge(int x, int y)
{
    list<int> :: iterator it;

    for (it=b[x].begin(); it!=b[x].end(); ++it)
        if ((*it)==y)
        {
            b[x].erase(it);
            break;
        }
}

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

    it=b[nod].begin();
    if (it!=b[nod].end())
    {
        x=*it;
        g<<x<<" ";
        Sterge(x, nod);
        Sterge(nod, x);
        Ciclu_Euler(x);
    }

}

int main()
{
    Citeste();

    DFS(1);

    if (solutie())
    {
        g<<"1 ";
        Ciclu_Euler(1);
    }
    else g<<"-1\n";

    f.close();
    g.close();
    return 0;
}