Cod sursa(job #1917501)

Utilizator iulian_f2kGuraliuc Iulian iulian_f2k Data 9 martie 2017 12:24:58
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
#define NMAX 100005
#define DIM 100000
using namespace std;

vector<int> V[NMAX], C;
stack<int> S;
char buff[DIM];
int N, M, nodStart, poz = DIM - 1;

void citire();
bool conditieGradPar();
void dfsIterativ(int nod);
void getNumber(int &x) {
    x = 0;
    while(buff[poz] < '0' || buff[poz] > '9')
        if(++poz == DIM)    fread(buff, 1, DIM, stdin), poz = 0;
    while('0' <= buff[poz] && buff[poz] <= '9') {
        x = x * 10 + (buff[poz] - '0');
        if(++poz == DIM)    fread(buff, 1, DIM, stdin), poz = 0;
    }
}

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;
    getNumber(N);
    getNumber(M);
    for(int i=1; i<=M; i++){
        getNumber(u);
        getNumber(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();
            V[vecin].erase( find(V[vecin].begin(), V[vecin].end(), nodStiva) );
            S.push(vecin);
        }
        else{
            S.pop();
            if(S.empty() == false)      cout << nodStiva << ' ';
        }
    }
}