Cod sursa(job #1343369)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 15 februarie 2015 13:45:46
Problema Ciclu Eulerian Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#include <vector>
#include <utility>
#define NX 100001
#define MX 500001
using namespace std;

int n,m;
vector< pair<int, int> > v[NX];
bool viz[MX];
vector<int> drum;

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

void citire()
{
    int i,x,y;
    pair<int, int> muchie;
    fin>>n>>m;
    for(i=1; i<=m; i++)
    {
        fin>>x>>y;
        muchie.first = y;
        muchie.second = i;
        v[x].push_back(muchie);

        muchie.first = x;
        v[y].push_back(muchie);
    }
}

int grad_par()
{
    int i;
    for(i=1; i<=n; i++)
    {
        if(v[i].size() % 2 == 1 || v[i].empty()) return 0;
    }

    return 1;
}

void hierholzer()
{
    pair<int, int> e;
    int i;

    drum.push_back(1);
    e = v[1].back();
    v[1].pop_back();
    viz[e.second] = 1;
    drum.push_back(e.first);
    fout<<1<<' '<<e.first<<' ';

    while(drum.size() > 1)
    {
        i = drum.back();
        //fout<<i<<' ';

        if(v[i].empty())
        {
            drum.pop_back();
        }
        else
        {
            e = v[i].back();
            v[i].pop_back();
            if(e.first == 1 && v[1].size() == 1) continue;
            else
            {
                if(!viz[e.second])
                {
                    viz[e.second] = 1;
                    drum.push_back(e.first);
                    fout<<e.first<<' ';
                }
            }
        }
    }

    fout<<'\n';
}

int main()
{
    citire();
    if(grad_par() == 0)
    {
        fout<<-1<<'\n';
    }
    else
    {
        hierholzer();
    }

    fin.close(); fout.close();
    return 0;
}