Cod sursa(job #2112547)

Utilizator Horia14Horia Banciu Horia14 Data 23 ianuarie 2018 16:44:11
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<cstdio>
#include<vector>
#include<stack>
#define MAX_N 100000
using namespace std;

vector<int>g[MAX_N + 1], sol;
stack<int>st;
int degree[MAX_N + 1], n, m;

void readGraph() {
    int x, y;
    FILE *fin = fopen("ciclueuler.in","r");
    fscanf(fin,"%d%d",&n,&m);
    for(int i = 0; i < m; i++) {
        fscanf(fin,"%d%d",&x,&y);
        g[x].push_back(y);
        g[y].push_back(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;
}

void Euler(int u) {
    vector<int>::iterator it;
    int v;
    st.push(u);
    while(!st.empty()) {
        u = st.top();
        if(g[u].size() > 0) {
            v = g[u].front();
            g[u].erase(g[u].begin());
            for(it = g[v].begin(); it != g[v].end() && (*it) != u; it++);
            g[v].erase(it);
            st.push(v);
        } else {
            st.pop();
            sol.push_back(u);
        }
    }
}

void printCycle() {
    int k;
    FILE *fout = fopen("ciclueuler.out","w");
    if(isEulerian()) {
        Euler(1);
        k = sol.size();
        for(int i = 0; i < k - 1; i++)
            fprintf(fout,"%d ",sol[i]);
        fprintf(fout,"\n");
    } else fprintf(fout,"-1\n");
    fclose(fout);
}

int main() {
    readGraph();
    printCycle();
    return 0;
}