Cod sursa(job #1581925)

Utilizator mariusn01Marius Nicoli mariusn01 Data 27 ianuarie 2016 13:02:42
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <bitset>
#include <vector>
#include <stack>

using namespace std;

vector < pair<int, int> > L[100010];
stack<int> st;
bitset<100010> b;
bitset<500010> f;
int D[100010];

int n, m, i, nod, vecin, x, y, s;

void dfs(int nod) {
    b[nod] = 1;
    for (vector< pair<int, int> >::iterator it = L[nod].begin(); it != L[nod].end(); it++) {
        if ( b[ it->first ] == 0)
            dfs(it->first);
    }
}

int main () {

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

    fin>>n>>m;
    for (i=1;i<=m;i++) {
        fin>>x>>y;
        L[x].push_back( make_pair(y, i) );
        L[y].push_back( make_pair(x, i) );
        D[x] ++;
        D[y] ++;
    }

    for (i=1;i<=n;i++)
        if (D[i] != 0) {
            s = i;
            dfs(i);
            break;
        }

    for (i=1;i<=n;i++)
        if (D[i] % 2 == 1 || ( D[i]!=0 && b[i] == 0 )) {
            fout<<-1;
            return 0;
        }


    int first = 1; // prima tiparire

    st.push(s);
    while (!st.empty()) {
        nod = st.top();

        if (D[nod] == 0) {
            if (!first)
                fout<<nod<<" ";
            first = 0;

            st.pop();
            continue;
        }

        while (  f[L[nod].back() . second] == 1 )
            L[nod].pop_back();

        int vecin = L[nod].back() . first;
        D[vecin] --;
        D[nod] --;
        f[L[nod].back() . second] = 1;
        L[nod].pop_back();

        st.push(vecin);
    }

    return 0;
}