Cod sursa(job #2404540)

Utilizator StefanManolacheManolache Stefan StefanManolache Data 12 aprilie 2019 23:29:25
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <cstdio>
#include <vector>

#define MAXN 100000
#define MAXM 500000
FILE *fin = fopen("ciclueuler.in", "r");
FILE *fout = fopen("ciclueuler.out", "w");

std::vector <int> st;
std::vector <int> v[MAXN + 1];

int edge[MAXM + 1];
int src[MAXM + 1];
int dest[MAXM + 1];
int grad[MAXN + 1];
int rez[MAXM + 1];
bool apare[MAXN + 1];

int main()
{
    int n, m, x, y, k = 0;
    fscanf(fin, "%d%d", &n, &m);
    for (int i = 1; i <= m; i++) {
        fscanf(fin, "%d%d", &x, &y);
        v[x].push_back(i);
        v[y].push_back(i);
        grad[x]++;
        grad[y]++;
        edge[i] = 1;
        src[i] = x;
        dest[i] = y;
    }
    bool ok = 1;
    for (int i = 1; i <= n; i++) {
        if (grad[x] % 2 == 1)
            ok = 0;
    }
    if (ok == 0) {
        fprintf(fout, "-1");
    }
    else {
        st.push_back(1);
        int l = 0;
        while (!st.empty() && l < 5) {
            int i = 0;
            int j = st.back();
            if (apare[j] == 1) {
                if (grad[st.back()] == 0)
                    while(!st.empty() && grad[st.back()] == 0) {
                        k++;
                        rez[k] = st.back();
                        st.pop_back();
                    }
                else
                    apare[j] = 0;
            }
            if (apare[j] == 0) {
                apare[j] = 1;
                int siz = v[j].size();
                while (edge[v[j][i]] != 1 && i < siz)
                    i++;
                if (i < siz) {
                    edge[v[j][i]] = 0;
                    grad[j]--;
                    if (src[v[j][i]] == j) {
                        st.push_back(dest[v[j][i]]);
                        grad[dest[v[j][i]]]--;
                    }
                    else {
                        st.push_back(src[v[j][i]]);
                        grad[src[v[j][i]]]--;
                    }
                }
            }

        }
        for (int i = 1; i < k; i++)
            fprintf(fout, "%d ", rez[i]);
    }
    return 0;
}