Cod sursa(job #1051121)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 9 decembrie 2013 18:56:35
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <stack>
#include <vector>
using namespace std;

stack <int> stk;
vector <int> v[100005];
vector <int> :: iterator it;
int deg[100005];
int n,m;

inline bool eulerian() {
    for (int i=1;i<=n;i++) if (deg[i]%2 != 0) return false;
    return true;
}

inline void euler(int start) {
    stk.push(start);
    while (!stk.empty()) {
        int nod = stk.top();
        if (deg[nod] <= 0) {
            stk.pop();
            printf("%d ",nod);
        } else {
            int muc = v[nod].back(); v[nod].pop_back();
            deg[muc]--; deg[nod]--;
            for (it=v[muc].begin();it!=v[muc].end();it++) if (*it == nod) {
                v[muc].erase(it);
                break;
            }
            if (deg[muc] > 0) stk.push(muc);
        }
    }
}

int main() {
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d %d",&n,&m);
    for (int i=1;i<=m;i++) {
        int a,b;
        scanf("%d %d",&a,&b);
        deg[a]++; deg[b]++;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    if (!eulerian()) printf("-1\n");
    else euler(1);
    return 0;
}