Queue & Graph Traversal

Table of contents

Problem

가중치가 없는 그래프에서 시작점부터 각 정점까지의 최단 edge 수를 BFS로 계산한다. 가중치가 있으면 같은 BFS가 일반적으로 성립하지 않는다.

Implementation

예제는 작은 고정 크기 adjacency matrix다. O(V²)이며 큰 sparse graph에서는 adjacency list로 O(V+E)를 목표로 한다. queue에 넣을 때 방문 표시하여 중복 삽입을 방지한다.

#include <assert.h>
#include <stddef.h>
#define N 5
static void bfs(const unsigned char graph[N][N], size_t start, int dist[N]) {
    size_t q[N], head=0, tail=0;
    for (size_t i=0;i<N;++i) dist[i]=-1;
    assert(start<N);
    dist[start]=0; q[tail++]=start;
    while (head<tail) {
        size_t u=q[head++];
        for (size_t v=0;v<N;++v) {
            if (graph[u][v] && dist[v]<0) {
                dist[v]=dist[u]+1;
                assert(tail<N);
                q[tail++]=v;
            }
        }
    }
}
int main(void) {
    const unsigned char g[N][N]={
        {0,1,1,0,0},{1,0,0,1,0},{1,0,0,1,0},{0,1,1,0,0},{0}
    };
    int d[N]; bfs(g,0,d);
    assert(d[0]==0 && d[3]==2 && d[4]==-1);
    return 0;
}

Extension

DFS는 연결 요소·cycle·topological 문제에 활용한다. directed/undirected cycle 판정은 다르다. 큰 입력의 recursion depth를 확인하고 필요한 경우 명시적 stack을 사용한다.