Cod sursa(job #1587497)

Utilizator iulian_f2kGuraliuc Iulian iulian_f2k Data 2 februarie 2016 09:52:39
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 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()
{
    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 verificare()
{
    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 dfsIterativ(int nod)
{
    int nodStiva, vecin;
    S.push(nod);
    while(!S.empty())
    {
        nodStiva=S.top();
        if( V[nodStiva].size() ){
            vecin=V[nodStiva].back();
            V[nodStiva].pop_back();                                             //sterg muchia
            V[vecin].erase( find(V[vecin].begin(), V[vecin].end(), nodStiva) );
            S.push(vecin);
        }
        else{
            S.pop();
            if(S.empty() == false)      // !!! !=0 nu functioneaza.
                C.push_back(nodStiva);
        }
    }
    afisare();
}

int main()
{
    freopen("ciclueuler.in", "rt", stdin);
    freopen("ciclueuler.out", "wt", stdout);
    citire();
    if(verificare()==0)
        cout<<"-1\n";
    else
        dfsIterativ(nodStart);



}