Cod sursa(job #1897702)

Utilizator DevilOnFieldTudor Horia Niculescu DevilOnField Data 1 martie 2017 17:25:30
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include<stdio.h>
#include<vector>

using namespace std;

FILE *in, *out;

const int MAXN = 100006;
const int MMAX = 500005;
vector <int> g[MAXN];
int lup[MAXN], n, m;
bool viz[MAXN];

struct mu
{
    int a, b;
};
mu chii[MMAX];
int poz = 0, tota = 0;
int iese[MMAX];

void afis()
{
    for(int i = 0; i < poz - 1; i++) {
        fprintf(out, "%d ", iese[i]);
    }
}

void euler(int nod)
{
/*
    while(!g[nod].empty() && viz[g[nod].back()]) {
        g[nod].pop_back();
    }
    for(auto &it : g[nod]) {
        if(!viz[it]) {
            viz[it] = true;
            tota++;
            if(chii[it].a == nod) {
                euler(chii[it].b);
            } else {
                euler(chii[it].a);
            }
        }
    }
*/
    while(!g[nod].empty()) {
        if(!viz[g[nod].back()]) {
            viz[g[nod].back()] = true;
            tota++;
            if(chii[g[nod].back()].a == nod) {
                euler(chii[g[nod].back()].b);
            } else {
                euler(chii[g[nod].back()].a);
            }
        }
        while(!g[nod].empty() && viz[g[nod].back()]) {
            g[nod].pop_back();
        }
    }
    //fprintf(out, "%d ", nod);
    iese[poz++] = nod;
    while(lup[nod] > 0) {
        //fprintf(out, "%d ", nod);
        iese[poz++] = nod;
        lup[nod]--;
        tota++;
    }


    return;
}

int main ()
{

    in = fopen("ciclueuler.in", "r");
    out = fopen("ciclueuler.out", "w");

    fscanf(in, "%d%d", &n, &m);

    for(int i = 0; i < m; i++) {
        //int x, y;
        fscanf(in, "%d%d", &chii[i].a, &chii[i].b);
        viz[i] = false;
        if(chii[i].a != chii[i].b) {
            g[chii[i].a].push_back(i);
            g[chii[i].b].push_back(i);
        } else {
            lup[chii[i].a]++;
        }
    }


    bool ciuciu = false;
    for(int i = 1; i <= n; i++) {
        if((g[i].size() % 2 == 1)) {
                ciuciu = true;
        }
    }
    if(ciuciu) {
        fprintf(out, "-1");
    } else {
        int nod = 1;
        while(g[nod].size() == 0) {
                nod++;
        }
        euler(nod);
        if(tota == m) {
            afis();
        } else {
            fprintf(out, "-1");
        }
    }

    fclose(in);
    fclose(out);

    return 0;
}