Cod sursa(job #2404544)

Utilizator StefanManolacheManolache Stefan StefanManolache Data 12 aprilie 2019 23:41:59
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 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);
        while (!st.empty()) {
            int i = st.back();
            if (v[i].empty()) {
                while (!st.empty() && v[st.back()].empty()) {
                    k++;
                    rez[k] = st.back();
                    st.pop_back();
                }
            }
            else {
                while (!v[i].empty() && edge[v[i].back()] == 0)
                    v[i].pop_back();
                if (!v[i].empty()){
                    int j = v[i].back();
                    v[i].pop_back();
                    edge[j] = 0;
                    if (i == src[j])
                        st.push_back(dest[j]);
                    else
                        st.push_back(src[j]);
                }
            }

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