๊ด€๋ฆฌ ๋ฉ”๋‰ด

Unfazedโ—๏ธ๐ŸŽฏ

[Java] ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ BFS| ๋ฐฑ์ค€ 1240 ๋…ธ๋“œ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ ๋ณธ๋ฌธ

๋ฌธ์ œ ํ•ด๊ฒฐ (PS)/์ฝ”ํ…Œ TIL

[Java] ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ BFS| ๋ฐฑ์ค€ 1240 ๋…ธ๋“œ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ

9taetae9 2024. 11. 4. 09:23
728x90

https://www.acmicpc.net/problem/1240

 

 

์ด ๋ฌธ์ œ๋Š” ํŠธ๋ฆฌ์—์„œ ๋‘ ๋…ธ๋“œ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋กœ, BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

 

์ ‘๊ทผ ๋ฐฉ์‹

  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ๋ฅผ ํ‘œํ˜„
  • ์–‘๋ฐฉํ–ฅ ๊ฐ„์„ ์œผ๋กœ ์ฒ˜๋ฆฌ (ํŠธ๋ฆฌ๋Š” ์–‘์ชฝ์œผ๋กœ ์ด๋™ ๊ฐ€๋Šฅ)
  • Edge ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜์—ฌ ๋ชฉ์ ์ง€ ๋…ธ๋“œ์™€ ๊ฐ€์ค‘์น˜ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ์ €์žฅ
static class Edge {
    int to;
    int weight;

    public Edge(int to, int weight) {
        this.to = to;
        this.weight = weight;
    }
}

 

BFS๋ฅผ ์ด์šฉํ•œ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ

 

  • ์‹œ์ž‘ ๋…ธ๋“œ๋ถ€ํ„ฐ BFS๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐ
  • distance ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ ๋ˆ„์  ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅ 
  • ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋Š” -1๋กœ ํ‘œ์‹œ => ๋ณ„๋„ visited ๋ฐฐ์—ด์„ ๋งŒ๋“ค์ง€ ์•Š์•„ ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ
static private int getDistance(int start, int end) {
    int[] distance = new int[N];
    Arrays.fill(distance, -1);
    distance[start] = 0;

    Queue<Integer> queue = new LinkedList<>();
    queue.offer(start);

    while (!queue.isEmpty()) {
        int currentNode = queue.poll();

        if (currentNode == end) {
            return distance[currentNode];
        }

        for (Edge e : graph[currentNode]) {
            if (distance[e.to] == -1) {
                distance[e.to] = distance[currentNode] + e.weight;
                queue.offer(e.to);
            }
        }
    }

    return distance[end];
}

 

 

main ์ฝ”๋“œ

static int N, M;
static ArrayList<Edge>[] graph;

public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());

    N = Integer.parseInt(st.nextToken());
    M = Integer.parseInt(st.nextToken());


    graph = new ArrayList[N];
    for (int i = 0; i < graph.length; i++) {
        graph[i] = new ArrayList<>();
    }

    for (int i = 0; i < N - 1; i++) {
        st = new StringTokenizer(br.readLine());
        int v1 = Integer.parseInt(st.nextToken()) - 1;
        int v2 = Integer.parseInt(st.nextToken()) - 1;
        int weight = Integer.parseInt(st.nextToken());

        graph[v1].add(new Edge(v2, weight));
        graph[v2].add(new Edge(v1, weight));
    }

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < M; i++) {
        st = new StringTokenizer(br.readLine());
        int v1 = Integer.parseInt(st.nextToken()) - 1;
        int v2 = Integer.parseInt(st.nextToken()) - 1;
        sb.append(getDistance(v1, v2)).append("\n");
    }

    System.out.print(sb);
}

 

์‹œ๊ฐ„ ๋ณต์žก๋„

๊ฐ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š”๋ฐ O(N)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๊ฑธ๋ฆฌ๊ณ  ๊ฐ ๊ฐ„์„ ์„ ๋ฐฉ๋ฌธํ•˜๋Š”๋ฐ O(E)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.

์ด ๋ฌธ์ œ์—์„œ๋Š” E = N-1 ์ด๋ฏ€๋กœ O(N + E) = O(N + (N-1)) = O(N)๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด ๋œ๋‹ค.

์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” M๋ฒˆ์˜ ๊ฑฐ๋ฆฌ๊ตฌํ•˜๋Š” ์š”์ฒญ์ด ์žˆ์œผ๋ฏ€๋กœ O(M * (N+E))=O(M * N) ์ด๋‹ค.

 

์ด ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด BFS์˜ ํ™œ์šฉ๊ณผ ๊ทธ๋ž˜ํ”„ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋‹ค์‹œ ๋ณต์Šตํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๊ณ , ๋‹ค๋งŒ ์ฟผ๋ฆฌ ์ˆ˜๊ฐ€ ๋” ๋งŽ์€ ๊ฒฝ์šฐ์—๋Š” ๋” ๋น ๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์•„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ LCA ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•˜์—ฌ ํ’€์ดํ•˜์˜€๋‹ค. ์ด๋ฅผ ์ถ”ํ›„ ํ•™์Šตํ•˜๊ณ  ์ •๋ฆฌํ•ด๋ณด์•„์•ผ๊ฒ ๋‹ค.

 

728x90