Cod sursa(job #1157558)

Utilizator Paula-ElenaPaula-Elena Margarit Paula-Elena Data 28 martie 2014 16:46:07
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bitset>
#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;
vector < int > ind[MAXN], G[MAXN];
bitset < MAXN*5 > used, viz;

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)
{
    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);
    }
}

bool conex()
{
    dfs(1);

    for (int i = 1; i <= N; ++i)
        if ( !viz[i] )
            return false;
    return true;
}

int main ()
{
    citire();
    bool ok = conex();

    if ( !ok )
    {
        fout << -1;
        return 0;
    }

    ciclu_euler(1);

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

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

    return 0;
}