Cod sursa(job #1096798)

Utilizator manutrutaEmanuel Truta manutruta Data 2 februarie 2014 16:47:55
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <stack>
using namespace std;

#define MAXN 100005
#define MAXM 500005

typedef vector< pair<int, int> >::iterator iter;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

int n, m;
vector< pair<int, int> > G[MAXN];
int gr[MAXN];
vector<int> sol;
stack<int> st;

bool iseuler()
{
    for (int i = 1; i <= n; i++) {
        if ((gr[i] & 1) == 1) {
            return false;
        }
    }
    return true;
}

void euler()
{
    st.push(1);
    while (!st.empty()) {
        int nd = st.top();

        if (!G[nd].empty()) {
            st.push(G[nd][0].first);
            G[G[nd][0].first].erase(find(G[G[nd][0].first].begin(), G[G[nd][0].first].end(), make_pair(nd, G[nd][0].second)));
            G[nd].erase(G[nd].begin());
            continue;
        }

        sol.push_back(nd);
        st.pop();
    }
}

int main()
{
    f >> n >> m;
    for (int i = 0; i < m; i++) {
        int x, y;
        f >> x >> y;
        G[x].push_back(make_pair(y, i));
        G[y].push_back(make_pair(x, i));

        gr[x]++, gr[y]++;
    }

    if (!iseuler()) {
        g << -1;
        return 0;
    }

    euler();
    sol.pop_back();

    for(vector<int>::iterator it = sol.begin(); it != sol.end(); it++) {
        g << *it << ' ';
    }

    f.close();
    g.close();
    return 0;
}