Cod sursa(job #999845)

Utilizator muresan_bogdanMuresan Bogdan muresan_bogdan Data 21 septembrie 2013 15:57:29
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include<fstream>
#include<list>
#include<queue>
#include<stack>
using namespace std;

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

struct nod{
    bool vizitat;
    int grad;
    list<int> vecini;
};

int n, m, a, b, i;
nod nodes[100002];
stack<int> stiva1, stiva2;

bool check() {
    queue<int> coada;
    bool ok =true;
    int x;
    list<int>::iterator it;
    coada.push(1);
    while(!coada.empty()) {
        x = coada.front();
        coada.pop();
        for(it = nodes[x].vecini.begin(); it != nodes[x].vecini.end(); ++it) {
            if(nodes[*it].vizitat == false) {
                nodes[*it].vizitat = true;
                coada.push(*it);
            }
        }
    }
    for(i = 1; i <= n; i++) {
        if((nodes[i].grad % 2 == 1) || (nodes[i].vizitat == false)) {
            ok = false;
        }
    }
    return ok;
}

void cicle(int x) {
    int a = x, b = 0;
    list<int>::iterator it;
    while(b != x) {
        b = nodes[a].vecini.front();
        nodes[a].vecini.pop_front();
        nodes[a].grad--;
        for(it = nodes[b].vecini.begin(); it != nodes[b].vecini.end(); ++it){
            if(*it == a) {
                nodes[b].vecini.erase(it);
                nodes[b].grad--;
                break;
            }
        }
        stiva1.push(b);
        a = b;
    }
}

int main() {
    fin >> n >> m;
    for(i = 0; i < m; i++){
        fin >> a >> b;
        nodes[a].vecini.push_back(b);
        nodes[b].vecini.push_back(a);
        nodes[a].grad++;
        nodes[b].grad++;
    }
    if(check() == true){
        stiva1.push(1);
        cicle(stiva1.top());
        stiva1.pop();
        while(!stiva1.empty()) {
            if(nodes[stiva1.top()].grad != 0) {
                cicle(stiva1.top());
            }
            else {
                stiva2.push(stiva1.top());
                stiva1.pop();
            }
        }
        while(!stiva2.empty()) {
            fout << stiva2.top() << ' ';
            stiva2.pop();
        }
    }
    else {
        fout << -1;
    }
    fin.close();
    fout.close();
    return 0;
}