Cod sursa(job #2262757)

Utilizator ShootingHorseHorsie Horse ShootingHorse Data 17 octombrie 2018 19:53:03
Problema BFS - Parcurgere in latime Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <stdio.h>
#include <stdbool.h>

#define MAX_NODES       100001
#define MAX_EDGES       1000001

struct edge_t {
    int id;
    int next;
} edges[MAX_EDGES];

int graph[MAX_NODES], dis[MAX_NODES], edgIt = 1;

void add_edge(int x, int y)
{
    struct edge_t edge = {y, graph[x]};
    edges[edgIt] = edge;
    graph[x] = edgIt++;
}

void bfs(int start)
{
    int q[MAX_NODES], q_push = 0, q_pop = 0, local_dis;
    bool vis[MAX_NODES] = {0};

    q[q_push++] = start;
    vis[start] = true;
    dis[start] = 0;
    local_dis = 1;
    while (q_pop < q_push) {
        int node = q[q_pop++];

        struct edge_t edge = edges[graph[node]];

        while (edge.id) {
            if (!vis[edge.id]) {
                q[q_push++] = edge.id;
                vis[edge.id] = true;
                dis[edge.id] = dis[node] + 1;
            }

            edge = edges[edge.next];
        }
    }
}

int main()
{
    int n, m, s;

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

    scanf("%d %d %d", &n, &m, &s);
    while (m--) {
        int x, y;
        scanf("%d %d", &x, &y);
        add_edge(x, y);
    }

    for (int i = 1; i <= n; i++)
        dis[i] = -1;

    bfs(s);

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

    return 0;
}