Cod sursa(job #1134465)

Utilizator andreeadeacAndreea Ioana Deac andreeadeac Data 6 martie 2014 16:36:27
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 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;
vector < int > ind[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;
        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;
}

void conex(int nod){
    viz[nod]=true;
    for(unsigned i=0;i<ind[nod].size();i++){
        int x=varf(ind[nod][i],nod);
        if(viz[x]==false)
            conex(x);
    }
}

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;
    ++l;
    if(l<=M)
        fout<<tata<<" ";
}

int main ()
{
    citire();
    int aux = 1;
    conex(1);
    for(int i=1;i<=N;i++)
        if(viz[i]==false || ind[i].size()%2==1)
            aux=0;
    if(aux==0)
        fout<<"-1";
    else
        ciclu_euler(1);

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

    return 0;
}