Cod sursa(job #2136789)

Utilizator Horia14Horia Banciu Horia14 Data 20 februarie 2018 10:59:15
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include<cstdio>
#include<stack>
#include<vector>
#define MAX_N 100000
using namespace std;

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

FILE *fout = fopen("ciclueuler.out","w");
node* g[MAX_N + 1];
stack<int>st;
vector<int>cycle;
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 = g[x];
    node* q;
    if(p->val == y) {
        q = p;
        g[x] = g[x]->next;
        delete q;
    } else {
        while(p->next->val != y)
            p = p->next;
        q = p->next;
        p->next = p->next->next;
        delete q;
    }
    return g[x];
}

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

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

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