본문 바로가기
자료구조 알고리즘

(C#) BFS

by LemongO 2024. 5. 12.

📌BFS 너비 우선 탐색

시작 정점을 방문한 후 시작 정점에 인접한 모든 정점들을 우선 방문하는 방법이다. 더 이상 방문하지 않은 정점이 없을 때까지 방문하지 않은 모든 정점들에 대해서도 너비 우선 검색을 적용한다

 

특징

  • Queue를 이용해 방문할 노드를 예약(Enqueue) 후 선입선출(LIFO) 원칙으로 탐색한다.
  • 예약한 노드는 반드시 방문 여부를 검사 해야한다.
    • 하지 않았을 때 무한 루프에 빠질 수 있다.

 

구현 코드

class Graph
{
    private int _nodeCount;
    private List<int>[] _adj;

    public Graph(int nodeCount)
    {
        _nodeCount = nodeCount;
        _adj = new List<int>[nodeCount];
        for (int i = 0; i < nodeCount; i++)
            _adj[i] = new List<int>();
    }

    public void AddEdge(int v, int edge)
    {
        _adj[v].Add(edge);
    }

    public void BFS(int startNode)
    {
        bool[] visited = new bool[_nodeCount];
        visited[startNode] = true;

        Queue<int> queue = new Queue<int>();
        queue.Enqueue(startNode);

        while (queue.Count > 0)
        {
            int now = queue.Dequeue();                
            Console.WriteLine(now);

            foreach (int n in _adj[now])
            {
                if (visited[n])
                    continue;

                visited[n] = true;
                queue.Enqueue(n);
            }
        }
    }
}

 

 

위 그림과 같은 구조를 가지는 그래프에서 BFS를 구현하면 다음과 같이 된다.

 

static void Main()
{
    Graph graph = new Graph(6);

    graph.AddEdge(0, 1);
    graph.AddEdge(0, 3);
    graph.AddEdge(1, 0);
    graph.AddEdge(1, 2);
    graph.AddEdge(1, 3);
    graph.AddEdge(2, 1);
    graph.AddEdge(2, 4);
    graph.AddEdge(3, 0);
    graph.AddEdge(3, 1);
    graph.AddEdge(3, 5);
    graph.AddEdge(4, 2);
    graph.AddEdge(5, 3);
}

 

그리고 BFS 시작을 0번 정점부터 한다고 하면 

graph.BFS(0);

 

다음과 같은 순서로 진행이 된다.

 

'자료구조 알고리즘' 카테고리의 다른 글

이진 탐색 (C#)  (0) 2024.05.27
선형 탐색 (C#)  (0) 2024.05.19
선택정렬 (C#)  (0) 2024.05.19
버블정렬 (C#)  (0) 2024.05.19
(C#) DFS  (0) 2024.05.10