공부/C#

[C#] 재귀방식, list를 활용한 DFS 기본 형태

굴러다니다니 2025. 2. 28. 23:50
728x90
using System;
using System.Collections.Generic;

public class DFSExample {
    static void DFS(List<int>[] graph, int node, bool[] visited) { //인접 리스트, node 번호, visited 여부
        if (visited[node]) return; // 이미 방문한 노드면 종료

        Console.WriteLine("Visiting node: " + node);
        visited[node] = true; // 방문 처리

        foreach (var neighbor in graph[node]) {
            DFS(graph, neighbor, visited); // 재귀 호출
        }
    }

    public static void Main() {
        int n = 6; // 노드 개수
        List<int>[] graph = new List<int>[n]; // 인접 리스트 초기화
        for (int i = 0; i < n; i++) graph[i] = new List<int>();

        // 그래프 연결 정보 설정
        graph[0].AddRange(new int[] {1, 2});
        graph[1].AddRange(new int[] {0, 3, 4});
        graph[2].AddRange(new int[] {0});
        graph[3].AddRange(new int[] {1});
        graph[4].AddRange(new int[] {1, 5});
        graph[5].AddRange(new int[] {4});

        bool[] visited = new bool[n]; // 방문 체크 배열
        Console.WriteLine("DFS 탐색 시작:");
        DFS(graph, 0, visited); // 0번 노드부터 탐색 시작
    }
}

 

자세히 설명한 버전

using System;
using System.Collections.Generic;

public class DFSExample {
    // DFS 함수 (재귀 방식)
    static void DFS(List<int>[] graph, int node, bool[] visited) {
        if (visited[node]) return; // 이미 방문한 노드라면 종료

        Console.WriteLine("Visiting node: " + node); // 현재 방문한 노드 출력
        visited[node] = true; // 방문 표시

        // 현재 노드와 연결된 모든 이웃(인접 노드) 탐색
        foreach (var neighbor in graph[node]) {
            DFS(graph, neighbor, visited); // 재귀적으로 DFS 호출
        }
    }

    public static void Main() {
        int n = 6; // 그래프의 노드 개수
        List<int>[] graph = new List<int>[n]; // 인접 리스트 선언 (노드 개수만큼 배열 할당)

        // 각 노드에 대해 List 초기화 (리스트를 생성해야 사용 가능)
        for (int i = 0; i < n; i++) {
            graph[i] = new List<int>();
        }

        // 그래프의 연결 정보 추가
        graph[0].AddRange(new int[] {1, 2}); // 0번 노드와 1, 2번 노드 연결
        graph[1].AddRange(new int[] {0, 3, 4}); // 1번 노드와 0, 3, 4번 노드 연결
        graph[2].AddRange(new int[] {0}); // 2번 노드와 0번 노드 연결
        graph[3].AddRange(new int[] {1}); // 3번 노드와 1번 노드 연결
        graph[4].AddRange(new int[] {1, 5}); // 4번 노드와 1, 5번 노드 연결
        graph[5].AddRange(new int[] {4}); // 5번 노드와 4번 노드 연결

        bool[] visited = new bool[n]; // 방문 여부를 저장할 배열 (기본값 false)
        
        Console.WriteLine("DFS 탐색 시작:");
        DFS(graph, 0, visited); // DFS 시작 (0번 노드부터 탐색)
    }
}
728x90