Cod sursa(job #1623740)

Utilizator EberardoVladianu Cosmin Eberardo Data 1 martie 2016 21:21:32
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

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

int n,m;

bool eulerian=1;

vector<vector<int> >lista_adiacenta;

vector<int>grad;

vector<bool>viz;

stack<int> stiva;

void citire()
{
    int i,nod1,nod2;
    fin>>n>>m;
    lista_adiacenta.resize(n+2);
    grad.resize(n+2);
    viz.resize(n+2);

    for(i=1;i<=m;i++)
    {
        fin>>nod1>>nod2;
        lista_adiacenta[nod1].push_back(nod2);
        grad[nod1]++;
        grad[nod2]++;
            lista_adiacenta[nod2].push_back(nod1);
    }
}

void verificare_grad()
{
    int i;
    for(i=1;i<=n;i++)
        if(grad[i]%2)
    {
        eulerian=0;
        return;
    }
}


void euler(int nod_inceput)
{
    int nod_curent,aux;
    vector<int>::iterator it;
    stiva.push(nod_inceput);
    while(!stiva.empty())
    {
        nod_curent=stiva.top();
        if(!lista_adiacenta[nod_curent].empty())
        {
            aux=lista_adiacenta[nod_curent].back();
            lista_adiacenta[nod_curent].pop_back();

            for(it=lista_adiacenta[aux].begin();*it!=nod_curent;it++);
            *it=lista_adiacenta[aux].back();

            lista_adiacenta[aux].pop_back();

            stiva.push(aux);
        }
        else
        {
            if(stiva.size()!=1)
            fout<<nod_curent<<' ';
            stiva.pop();
        }
    }

}

void rezolvare()
{
    verificare_grad();
    if(eulerian==true)
        euler(1);
    else
        fout<<-1;
}
int main()
{
    citire();
    rezolvare();
    return 0;
}