Cod sursa(job #1596044)

Utilizator iulian_f2kGuraliuc Iulian iulian_f2k Data 10 februarie 2016 18:54:51
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream> //G este multigraf. Sa se det. daca G este eulerian.
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>    // find
#define NMAX 100005
#define MMAX 500005
using namespace std;
vector<int> V[NMAX], C;
stack<int> S;
int N, M, nodStart;
void citire();
bool conditieGradPar();
void afisare();
void dfs();


int main()
{
    freopen("ciclueuler.in", "rt", stdin);
    freopen("ciclueuler.out", "wt", stdout);
    citire();
    if(conditieGradPar()==0)
        cout<<"-1\n";
    else{
        S.push(nodStart);
        dfs();
        afisare();
    }

}

void citire()
{
    int u,v;
    scanf("%d%d", &N, &M);

    for(int i=1; i<=M; i++){
        scanf("%d %d", &u, &v);
        V[u].push_back(v);
        V[v].push_back(u);
    }
}
bool conditieGradPar()
{
    for(int i=1; i<=N; i++)
        if(V[i].size() % 2 == 1)
            return 0;
        else if(!nodStart)  //avem nevoie de un nod din care sa pornim parcurgerea; acesta nu trebuie sa fie izolat
            nodStart=i;
    return 1;
}

void afisare()
{
    for(int i=0; i<C.size()-1; i++)
        cout<<C[i]<<' ';
    cout<<'\n';
}

void dfs()
{
    int vecin, nod;
    nod = S.top();
    while(V[nod].size() ){
        vecin = V[nod].back();
        S.push(vecin);
        V[nod].pop_back();
        V[vecin].erase( find (V[vecin].begin(), V[vecin].end(), nod) );
        dfs();
    }
    C.push_back(nod);
    S.pop();
}