Cod sursa(job #2112554)

Utilizator Horia14Horia Banciu Horia14 Data 23 ianuarie 2018 16:50:05
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include<cstdio>
#include<vector>
#include<stack>
#include<cctype>
#define BUF_SIZE 1 << 19
#define MAX_N 100000
using namespace std;

vector<int>g[MAX_N + 1], sol;
stack<int>st;
char buf[BUF_SIZE];
int degree[MAX_N + 1], n, m, pos = BUF_SIZE;

char getChar(FILE *fin) {
    if(pos == BUF_SIZE) {
        fread(buf,1,BUF_SIZE,fin);
        pos = 0;
    }
    return buf[pos++];
}

inline int read(FILE *fin) {
    int res = 0;
    char ch;
    do {
        ch = getChar(fin);
    }while(!isdigit(ch));
    do {
        res = 10*res + ch - '0';
        ch = getChar(fin);
    }while(isdigit(ch));
    return res;
}

void readGraph() {
    int x, y;
    FILE *fin = fopen("ciclueuler.in","r");
    n = read(fin); m = read(fin);
    for(int i = 0; i < m; i++) {
        x = read(fin); y = read(fin);
        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;
}