Cod sursa(job #964444)

Utilizator TripluYOlteanu Costin TripluY Data 20 iunie 2013 23:13:07
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <vector>

#define N_MAX 262144

using namespace std;

bool vizitat[N_MAX];
vector <int> graf[N_MAX];
int n;
vector <int> ciclu;

void euler(int v)
{
    int w;
    vector <int>::iterator it;
    while(!graf[v].empty())
    {
        w = graf[v].at(0);
        graf[v].erase(graf[v].begin());
        for(it=graf[w].begin();it!=graf[w].end();++it)
            if(*it == v)
            {
                graf[w].erase(it);
                break;
            }
        euler(w);
    }
    ciclu.push_back(v);
}

bool df_term()
{
    for(int i=0;i<n;++i)
        if(vizitat[i] == 0)
        return 0;
    return 1;
}

bool df(int nod_curent = 0)
{
    vizitat[nod_curent] = 1;
    if(df_term())
        return 1;
    for(unsigned int i=0;i<graf[nod_curent].size();++i)
    {
        if(!vizitat[graf[nod_curent][i]])
        {
            if(df(graf[nod_curent][i]))
                return 1;
        }
    }
    vizitat[nod_curent] = 0;
    return 0;
}

int main()
{
    ifstream f("ciclueuler.in");
    ofstream g("ciclueuler.out");
    int d[N_MAX],i,m,x_nou,y_nou;
    f>>n>>m;
    for(i=0;i<m;++i)
    {
        f>>x_nou>>y_nou;
        --x_nou;
        --y_nou;
        graf[x_nou].push_back(y_nou);
        graf[y_nou].push_back(x_nou);
        ++d[x_nou];++d[y_nou];
    }
    for(i=0;i<n;++i)
    {
        if(d[i]%2 != 0)
        {f.close();return 0;}
        vizitat[i] = 0;
    }
    vizitat[0] = 1;
    if(!df()) {g<<"-1";f.close();g.close();}

    euler(0);
    m = ciclu.size() - 1;
    for(i=0;i<m;++i)
        g<<ciclu[i]+1<<" ";
    f.close();
    g.close();
    return 0;
}