Cod sursa(job #2196131)

Utilizator 24601Dan Ban 24601 Data 18 aprilie 2018 16:23:41
Problema BFS - Parcurgere in latime Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.67 kb
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define NMAX 100000
#define MMAX 1000000
#define CHUNK (1 << 22)

static struct vlist {
    int v;
    struct vlist *next;
} *adj_list[NMAX+1], edges[MMAX];

static int dist[NMAX+1], q[NMAX << 2];

static char buf[CHUNK];
static ssize_t blen, bpos = CHUNK;

static inline int read_int(int end)
{
    int x = 0, sgn = 1;

    while (1) {
        if (bpos == CHUNK) {
            blen = read(0, buf, CHUNK);
            bpos = 0; }

        if (buf[bpos] == '-') {
            sgn = -1;
        } else if ('0' <= buf[bpos] && buf[bpos] <= '9') {
            x = x * 10 + (buf[bpos] - '0');
        } else if (buf[bpos] == end) {
            bpos++;
            return sgn * x;
        }

        bpos++;
    }
}

int main(void)
{
    int n, m, s, i, u, v, qt, qh;
    struct vlist *new_v;

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

    n = read_int(' ');
    m = read_int(' ');
    s = read_int('\n');

    for (i = 0; i < m; i++) {
        u = read_int(' ');
        v = read_int('\n');

        new_v = edges + i;
        new_v->v = v;
        new_v->next = adj_list[u];
        adj_list[u] = new_v;
    }

    memset(dist, -1, sizeof(dist[0]) * (n + 1));

    qt = qh = 0;
    q[qt] = s;
    dist[s] = 0;
    qt++;

    while (qh < qt) {
        i = q[qh];
        qh++;

        for (new_v = adj_list[i]; new_v != NULL; new_v = new_v->next) {
            if (dist[new_v->v] == -1) {
                dist[new_v->v] = dist[i] + 1;
                q[qt] = new_v->v;
                qt++;
            }
        }
    }

    for (i = 1; i <= n; i++) {
        printf("%d%c", dist[i], " \n"[i == n]);
    }

    return 0;
}