Cod sursa(job #2103737)

Utilizator BazagazealOancea Eduard Bazagazeal Data 10 ianuarie 2018 19:09:26
Problema Ciclu Eulerian Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.41 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct _Node
{
    int nod;
    struct _Node *next;
} Node;
Node *p[250005];

int cycle[500001], sizeOfCycle, n, m, counter;

void addToCycle(int i)
{
    cycle[++sizeOfCycle] = i;
}

void bulaneala(int i, int j)
{
    Node *aux;
    Node *q = p[i];
    if(i != j && q->next != p[i])
    {
        while(q->next->nod != j)
        {
            q = q->next;
        }
        aux = q->next;
        q->next = q->next->next;
        aux->next = NULL;
        q = p[j];
        while(q->next->nod != i)
        {
            q = q->next;
        }
        aux = q->next;
        q->next = q->next->next;
        aux->next = NULL;
    }
    else if(q->next != p[i])
    {
        while(q->next->nod != j)
        {
            q = q->next;
        }
        aux = q->next;
        q->next = q->next->next;
        aux->next = NULL;
    }
}
void adaugare_dupa(Node *p, int valoare)
{
    Node *q=(Node*)malloc(sizeof(Node));
    q->next=p->next;
    q->nod=valoare;
    p->next=q;
}

void cicluEulerian(int i)
{
    int j;
    Node *q = p[i]->next;

    while(q != p[i] && q != NULL)
    {
       /* Node *r;
        for(j = 1; j <= n; j++)
        {
            r = p[j]->next;
            while(r != p[j])
            {
                printf("%d ", r->nod);
                r = r->next;
            }
            printf("\n");
        }
        printf("\n");
        printf("%d %d asta e muchia de o bulanesti\n", i, q->nod);
        printf("%d asta e nodu\n", q->nod); */
        bulaneala(i, q->nod);
        cicluEulerian(q->nod);
        q = q->next;
    }
    addToCycle(i);
}
int main()
{
    int i, x, y;
    Node *q;
    FILE *f = fopen("ciclueulerian.in", "r");
    FILE *g = fopen("ciclueulerian.out", "w");
    fscanf(f, "%d%d", &n, &m);
    counter = m-1;
    for(i = 1; i <= n; i++)
    {
        p[i] = (Node*)malloc(sizeof(Node));
        p[i]->next = p[i];
        p[i]->nod = 0;
    }
    for(i = 1; i <= m; i++)
    {
        fscanf(f, "%d%d", &x, &y);
        if(x != y)
        {
            adaugare_dupa(p[x], y);
            adaugare_dupa(p[y], x);
        }
        else adaugare_dupa(p[x], x);
    }
    cicluEulerian(1);
    if(sizeOfCycle >= m)
    {
        for(i = 1; i <= m; i++)
            fprintf(g, "%d ", cycle[i]);
    }
    else fprintf(g, "-1");
    return 0;
}