Cod sursa(job #1211612)

Utilizator mariusn01Marius Nicoli mariusn01 Data 22 iulie 2014 22:02:19
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <stack>

#define DIMN 100010
#define DIMM 500010

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

vector <pair <int, int> > L[DIMN];
bitset<DIMM> U;
stack<int> S;
int D[DIMN];

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

void dfs(int nod) {
    U[nod] = 1;
    for (int i=0;i<L[nod].size(); i++)
        if (U[ L[nod][i].first ] == 0)
            dfs(L[nod][i].first);
}

int main() {
    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) {
            dfs(i);
            s = i;
            break;
        }

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

    U.reset();

    int first = 1;

    S.push(s);
    while (!S.empty()) {
        x = S.top();
        if (D[x] == 0) {
            if (!first) {
                fout<<x<<" ";
            }
            first = 0;
            S.pop();
            continue;
        }

        while (U[L[x][ L[x].size()-1  ].second] == 1)
            L[x].erase(  L[x].end()-1 );

        U[L[x][ L[x].size()-1  ].second] = 1;
        S.push(  L[x][ L[x].size()-1  ].first  );
        D[x]--;
        D[  L[x][ L[x].size()-1  ].first ]--;
        L[x].erase(  L[x].end()-1 );
    }

    return 0;
}