Cod sursa(job #1411685)

Utilizator rockerboyHutter Vince rockerboy Data 31 martie 2015 21:24:22
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <fstream>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <stack>
#include <list>
#include <queue>

std::ifstream be ("ciclueuler.in");
std::ofstream ki ("ciclueuler.out");

int n, m;
std::vector< std::list<int> > x;

bool ok_fokszam()
{
    for (int i=1; i<=n; i++)
        if (x[i].size() % 2 || x[i].size() == 0)
            return false;
    return true;
}

inline void betesz (int a, int b)
{
    x[a].push_back(b);
    x[b].push_back(a);
}

inline void kivesz (int a, int b)
{
    x[a].erase (std::find (x[a].begin(), x[a].end(), b));
    x[b].erase (std::find (x[b].begin(), x[b].end(), a));
}

std::vector<bool> latott;
std::queue<int> q;
int bfs (int csp)
{
    latott.resize (n+1, 0);
    std::list<int>::iterator it;
    int db = 1;

    q.push (csp);
    latott[csp] = true;

    while (!q.empty()) {
        csp = q.front(); q.pop();
        for (it = x[csp].begin(); it != x[csp].end(); it++) {
            if (!latott[*it]) {
                db++;
                latott[*it] = true;
                q.push (*it);
            }
        }
    }

    return db;
}

bool euleri ()
{
    if (!ok_fokszam())  return false;
    if (bfs(1) != n)    return false;

    return true;
}

void euler (int kezd)
{
    std::list<int>::iterator it;
    std::stack<int> verem;
    int u = 1, v;

    do {
        while (!x[u].empty()) {
            v = x[u].front();
            verem.push (u);
            kivesz (u, v);
            u = v;
        }
        u = verem.top(); verem.pop();
        ki << u << " ";
    }   while (!verem.empty());
}

int main()
{
    be >> n >> m;
    x.resize (n+1);

    int a, b;
    for (int i=0; i<m; i++) {
        be >> a >> b;
        betesz (a, b);
    }

    std::find (x[1].begin(), x[1].end(), 5);

    if (!euleri()) ki << -1 << " ";
    else euler (1);
}