Cod sursa(job #1134459)

Utilizator andreeadeacAndreea Ioana Deac andreeadeac Data 6 martie 2014 16:23:21
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 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);
    }
}

void conex(int nod){
    viz[nod]=true;
    for(unsigned i=0;i<ind[nod].size();i++)
        if(v[ind[nod][i]].unu==nod){
            if(viz[v[ind[nod][i]].doi]==false)
                conex(v[ind[nod][i]].doi);
        }
        else{
            if(viz[v[ind[nod][i]].unu]==false)
                conex(v[ind[nod][i]].unu);
        }
}
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;
    //fout<<tata<<" ";
}

int main ()
{
    citire();
    int aux = 1;
    //while ( ind[aux].size() == 0 )
    //    ++aux;
    //ciclu_euler(aux);

    //if ( l == M + 1 )
    //{
    //    for (int i = 1; i <= M; ++i)
    //        fout << sol[i] << " ";
    //}
    //else
    //    fout << -1;
    conex(1);
    for(int i=1;i<=N;i++)
        if(viz[i]==false || ind[i].size()%2==1){
            aux=0;
            fout<<i<<" "<<viz[i]<<"\n";
        }
    if(aux==0)
        fout<< -1;
    else{
        ciclu_euler(1);
        for(int i=1;i<l;i++)
            fout<<sol[i]<<" ";
    }

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

    return 0;
}