Cod sursa(job #1916954)

Utilizator iulian_f2kGuraliuc Iulian iulian_f2k Data 9 martie 2017 10:45:29
Problema Ciclu Eulerian Scor 80
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>
#define NMAX 100005
using namespace std;

vector<int> V[NMAX], C;
stack<int> S;

int N, M, nodStart;

void citire();
bool conditieGradPar();
void dfsIterativ(int nod);


int main()
{
    freopen("ciclueuler.in", "rt", stdin);
    freopen("ciclueuler.out", "wt", stdout);
    citire();
    if(conditieGradPar()==0)        cout<<"-1\n";
    else                            dfsIterativ(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 conditieGradPar()
{
    for(int i=1; i<=N; i++)
        if(V[i].size() % 2 == 1)
            return 0;
        else if(!nodStart)
            nodStart = i;
    return 1;
}

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)      cout << nodStiva << ' ';
        }
    }
}