Cod sursa(job #1165155)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 2 aprilie 2014 15:15:24
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
#include <stack>
#include <queue>

using namespace std;

const int MAX_N = 100002;
const int MAX_M = 500002;

int N, M;
vector < int > sol;
vector < pair < int, int > > v[MAX_N];
queue < int > Q;
stack < int > st;
bool out[MAX_M], m[MAX_N];

bool EulerianGraph() {
    for(int i = 1; i <= N; ++i)
        if(v[i].size() % 2)
            return 0;

    m[1] = 1;
    Q.push(1);
    int cnt = 1;
    while(!Q.empty()) {
        int x = Q.front();
        Q.pop();

        for(int i = 0; i < (int) v[x].size(); ++i) {
            int y = v[x][i].first;

            if(!m[y]) {
                m[y] = 1;
                Q.push(y);
                ++cnt;
            }
        }
    }

    if(cnt < N)
        return 0;
    return 1;
}

void Euler() {
    st.push(1);

    while(!st.empty()) {
        int x = st.top();

        if(v[x].size() > 0) {
            int y = v[x][v[x].size() - 1].first, ind = v[x][v[x].size() - 1].second;

            if(out[ind] == 0) {
                out[ind] = 1;
                st.push(y);
            }
            v[x].pop_back();
        }
        else {
            sol.push_back(x);
            st.pop();
        }
    }
}

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

    f >> N >> M;
    for(int i = 1, x, y; i <= M; ++i) {
        f >> x >> y;

        v[x].push_back(make_pair(y, i));
        v[y].push_back(make_pair(x, i));
    }

    if(EulerianGraph()) {
        Euler();

        for(int i = 0; i < sol.size() - 1; ++i)
            g << sol[i] << " ";
        g << "\n";
    }
    else g << -1 << "\n";

    f.close();
    g.close();

    return 0;
}