Cod sursa(job #1935309)

Utilizator hevelebalazshevele balazs hevelebalazs Data 22 martie 2017 10:42:43
Problema Ciclu Eulerian Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.44 kb
#include <stdio.h>
#include <stdlib.h>

int V1[500000];
int V2[500000];
int Used[500000];

int S[500001];
int sn;

int Q[500001];
int qn;

int *E[100000];
int N[100000];

int main() {
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);
    
    int n, m;
    scanf("%i%i", &n, &m);
    
    int i;
    for (i = 0; i < m; ++i) {
        int v1, v2;
        scanf("%i%i", &v1, &v2);
        
        v1--;
        v2--;
        
        V1[i] = v1;
        V2[i] = v2;
        
        E[v1] = realloc(E[v1], (N[v1] + 1) * sizeof(int));
        E[v1][N[v1]++] = i;
        
        E[v2] = realloc(E[v2], (N[v2] + 1) * sizeof(int));
        E[v2][N[v2]++] = i;
    }
    
    for (i = 0; i < n; ++i) {
        if (N[i] % 2) {
            printf("-1\n");
            goto bye;
        }
    }

    S[sn++] = 0;
    
    while (sn) {
        int v1 = S[sn - 1];
        
        if (N[v1]) {
            i = E[v1][N[v1] - 1];
            N[v1]--;
            
            if (Used[i]) continue;
            Used[i] = 1;
            
            int v2 = (V1[i] == v1) ? (V2[i]) : (V1[i]);
            
            S[sn++] = v2;
        }
        else {
            sn--;
            Q[qn++] = v1;
        }
    }
    
    for (i = 0; i < qn - 1; ++i) {
        if (i) printf(" ");
        printf("%i", Q[i] + 1);
    }
    printf("\n");
    
    bye:
    return 0;
}