Cod sursa(job #1511805)

Utilizator usermeBogdan Cretu userme Data 27 octombrie 2015 10:25:31
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>
#include <vector>

using namespace std;

const int MAXN = 100000;
const int MAXM = 500000;

FILE *f = fopen("ciclueuler.in", "r");
FILE *h = fopen("ciclueuler.out", "w");

int n, m;

struct muchie{
    int nr, vecin;
};

vector<muchie> graf[MAXN + 1];

int grad[MAXN + 1];

bool utilizat[MAXM + 1];

int raspuns[MAXM + 2], k;

void ciclu(int x) {
    for (int i = 0; i < (int)graf[x].size(); ++i) {
        if (!utilizat[graf[x][i].nr]) {
            utilizat[graf[x][i].nr] = true;
            ciclu(graf[x][i].vecin);
        }
    }
    raspuns[++k] = x;
}

int main() {
    fscanf(f, "%d%d", &n, &m);
    for (int i = 1; i <= m; ++i) {
        int x, y;
        fscanf(f, "%d%d", &x, &y);
        graf[x].push_back({i, y});
        graf[y].push_back({i, x});
        ++grad[x];
        ++grad[y];
    }
    bool existaSol = true;
    for (int i = 1; i <= n && existaSol; ++i) {
        if(grad[i] & 1) {
            existaSol = false;
        }
    }
    if (existaSol) {
        int i = 1;
        while(grad[i] == 0 && i < n) {
            ++i;
        }
        ciclu(i);
        if (k != m + 1) {
            fprintf(h , "-1\n");
        } else {
            for (int i = 1; i <= m; ++i) {
                fprintf(h, "%d ", raspuns[i]);
            }
        }
    } else {
        fprintf(h , "-1\n");
    }
    return 0;
}