Cod sursa(job #1136838)

Utilizator Paula-ElenaPaula-Elena Margarit Paula-Elena Data 9 martie 2014 11:19:43
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
using namespace std;

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

const int MAXN = 100009;

int N, M, sol[MAXN*5], l, nod;
vector < int > ind[MAXN], G[MAXN];
bool used[MAXN*5], viz[MAXN];

struct muchii
{
    int unu, doi;
}   v[MAXN*5];

void citire()
{
    fin >> N >> M;
    for (int i = 1; i <= M; ++i)
    {
        int x, y;
        fin >> x >> y;
        G[x].push_back(y);
        G[y].push_back(x);
        v[i].unu = x, v[i].doi = y;
        ind[x].push_back(i);
        ind[y].push_back(i);
    }
}

inline int varf(int nod, int val)
{
    if ( v[nod].unu == val )
        return v[nod].doi;
    return v[nod].unu;
}

inline void ciclu_euler(int tata)
{
    int L = ind[tata].size();

    for (int i = 0; i < L; ++i)
    {
        int indice = ind[tata][i];
        if ( !used[indice] )
        {
            used[indice] = true;
            int fiu = varf(indice, tata);
            ciclu_euler(fiu);
        }
    }

    sol[++l] = tata;
}

inline void DFS(int tata)
{
    ++nod;
    viz[tata] = true;

    int L = G[tata].size();
    for (int i = 0; i < L; ++i)
    {
        int fiu = G[tata][i];
        if ( !viz[fiu] )
            DFS(fiu);
    }
}

int main ()
{
    citire();
    DFS(1);

    if ( nod == N )
    {
        ciclu_euler(1);

        if ( l == M + 1 )
        {
            for (int i = 1; i <= M; ++i)
                fout << sol[i] << " ";
        }
        else
            fout << -1;
    }
    else
        fout << -1;

    fin.close();
    fout.close();

    return 0;
}