Cod sursa(job #2211988)

Utilizator Horia14Horia Banciu Horia14 Data 12 iunie 2018 18:28:47
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<cstdio>
#include<vector>
#include<stack>
#define MAX_N 100000
using namespace std;

struct node {
    int val;
    node* next;
};

FILE* fout = fopen("ciclueuler.out","w");
node* g[MAX_N+1];
vector<int>sol;
stack<int>st;
int degree[MAX_N+1], n, m;

inline void insertEdge(int x, int y) {
    node* elem = new node;
    elem->val = y;
    elem->next = g[x];
    g[x] = elem;
}

void readGraph() {
    int i, x, y;
    FILE* fin = fopen("ciclueuler.in","r");
    fscanf(fin,"%d%d",&n,&m);
    for(i = 0; i < m; i++) {
        fscanf(fin,"%d%d",&x,&y);
        insertEdge(x,y);
        insertEdge(y,x);
        degree[x]++;
        degree[y]++;
    }
    fclose(fin);
}

bool isEulerian() {
    bool ok = true;
    for(int i = 1; i <= n && ok; i++)
        if(degree[i] & 1)
            ok = false;
    return ok;
}

node* deleteEdge(int x, int y) {
    node* p, *q;
    if(g[x]->val == y) {
        p = g[x];
        g[x] = g[x]->next;
        delete p;
    } else {
        p = g[x];
        while(p->next->val != y)
            p = p->next;
        q = p->next;
        p->next = p->next->next;
        delete q;
    }
    return g[x];
}

void findEulerianCycle(int u) {
    int v, x;
    st.push(u);
    while(!st.empty()) {
        v = st.top();
        if(g[v]) {
            x = g[v]->val;
            g[v] = deleteEdge(v,x);
            g[x] = deleteEdge(x,v);
            st.push(x);
        } else {
            sol.push_back(st.top());
            st.pop();
        }
    }
}

void printCycle() {
    int i, k;
    k = sol.size();
    for(i = 0; i < k - 1; i++)
        fprintf(fout,"%d ",sol[i]);
    fprintf(fout,"\n");
}

int main() {
    readGraph();
    if(isEulerian()) {
        findEulerianCycle(1);
        printCycle();
    } else fprintf(fout,"-1\n");
    fclose(fout);
    return 0;

}