Cod sursa(job #1523484)

Utilizator caen1c a e n caen1 Data 12 noiembrie 2015 19:41:36
Problema BFS - Parcurgere in latime Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.33 kb
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>

#define NMAX 100000

struct llist {
    int v, d;
    struct llist *next;
};

static struct llist *ADJ[NMAX + 1];
static struct llist *Q[2 * NMAX + 1];
static int D[NMAX + 1];
static int head, tail;

static struct llist *make_node(int u)
{
    struct llist *nod = malloc(sizeof(struct llist));

    nod->v = u;
    nod->d = INT_MAX;

    return nod;
}

static void insert_edge(int u, struct llist *nod)
{
    nod->next = ADJ[u];
    ADJ[u] = nod;
}

static void bfs(int s)
{
    struct llist *src = make_node(s);
    struct llist *u, *v;

    src->d = D[s] = 0;
    Q[tail++] = src;
    while (head != tail) {
        u = Q[head++];
        v = ADJ[u->v];
        while (v) {
            if (D[v->v] == -1) {
                D[v->v] = D[u->v] + 1;
                Q[tail++] = v;
            }
            v = v->next;
        }
    }
}

int main(void)
{
    int m, n, s;
    int i, u, v;
    struct llist *nod;

    freopen("bfs.in", "r", stdin);
    freopen("bfs.out", "w", stdout);

    for (i = 1; i <= NMAX; i++)
        D[i] = -1;

    scanf("%u %u %u", &n, &m, &s);
    for (i = 0; i < m; i++) {
        scanf("%u %u", &u, &v);
        nod = make_node(v);
        insert_edge(u, nod);
    }

    bfs(s);

    for (i = 1; i <= n; i++)
        printf("%d ", D[i]);
    printf("\n");

    return 0;
}