Cod sursa(job #1955551)

Utilizator cameleonGeorgescu Dan cameleon Data 6 aprilie 2017 06:08:29
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 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();
            if (!stk.empty()) 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;
            }
            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);
    printf("\n");
    return 0;
}