1 분 소요

BFS(너비 우선 탐색)

최대한 넓게 이동한 다은 더 이상 갈 수 없을 때 밑으로 내려간다. 보통 힙을 사용하며 두 노드 사이의 최단 경로를 찾고 싶을 때 사용함.

function solution(n, wires) {
    let minDiff = Infinity;

    // 인접 리스트 그래프 생성
    const graph = Array.from({ length: n + 1 }, () => []);

    for (const [v1, v2] of wires) {
        graph[v1].push(v2);
        graph[v2].push(v1);
    }

    function bfs(start) {
        let count = 1;
        const queue = [start];
        const visited = Array(n + 1).fill(false);
        visited[start] = true;

        while (queue.length > 0) {
            const node = queue.shift();

            for (const next of graph[node]) {
                if (!visited[next]) {
                    visited[next] = true;
                    queue.push(next);
                    count++;
                }
            }
        }
        return count;
    }

    for (const [v1, v2] of wires) {
        // 연결 끊기
        graph[v1] = graph[v1].filter(v => v !== v2);
        graph[v2] = graph[v2].filter(v => v !== v1);

        // BFS로 서브트리 크기 계산
        const size1 = bfs(v1);
        const size2 = n - size1;
        minDiff = Math.min(minDiff, Math.abs(size1 - size2));

        // 연결 복구
        graph[v1].push(v2);
        graph[v2].push(v1);
    }

    return minDiff;
}

DFS(깊이 우선 탐색)

최대한 깊이 내려간 뒤 더 이상 깊이 갈 곳이 없는 경우 옆으로 이동

function solution(n, wires) {
    let minDiff = Infinity;

    // 인접 리스트 그래프 생성
    const graph = Array.from({ length: n + 1 }, () => []);

    for (const [v1, v2] of wires) {
        graph[v1].push(v2);
        graph[v2].push(v1);
    }

    // DFS로 연결된 송전탑 개수 찾기
    function dfs(node, visited) {
        let count = 1; // 현재 노드를 포함한 개수
        visited[node] = true;

        for (const next of graph[node]) {
            if (!visited[next]) {
                count += dfs(next, visited);
            }
        }
        return count;
    }

    // 각 전선을 끊어보고 최소 차이 갱신
    for (const [v1, v2] of wires) {
        // 연결 끊기
        graph[v1] = graph[v1].filter(v => v !== v2);
        graph[v2] = graph[v2].filter(v => v !== v1);

        // 송전탑 개수 계산
        const visited = Array(n + 1).fill(false);
        const size1 = dfs(v1, visited);
        const size2 = n - size1;
        minDiff = Math.min(minDiff, Math.abs(size1 - size2));

        // 연결 복구
        graph[v1].push(v2);
        graph[v2].push(v1);
    }

    return minDiff;
}