요깨비's LAB

[백준, 그래프 이론, Java] P.1922 네트워크 연결 (프림) 본문

알고리즘(Java)/그래프 이론

[백준, 그래프 이론, Java] P.1922 네트워크 연결 (프림)

요깨비 2021. 4. 16. 18:28

이번에는 프림 알고리즘 방식으로 풀었습니다. 이것 또한 정점과 간선을 인스턴스화 하여 풀었습니다.

import java.util.*;

class Vertax {
    int id;
    boolean isVisited;
    List<Edge> linkedVertaxes;

    public Vertax(int id) {
        this.id = id;
        this.isVisited = false;
        this.linkedVertaxes = new ArrayList<>();
    }
}

class Edge {
    int toId;
    int value;

    public Edge(int toId, int value) {
        this.toId = toId;
        this.value = value;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scr = new Scanner(System.in);

        int N = scr.nextInt();
        int M = scr.nextInt();
        List<Vertax> vertaxes = new ArrayList<>();
        Map<Integer, Map<Integer, Integer>> edges = new HashMap<>();

        for (int i = 0; i < N; i++) {
            vertaxes.add(new Vertax(i));
            edges.put(i, new HashMap<>());
        }

        for (int i = 0; i < M; i++) {
            int fromId = scr.nextInt() - 1;
            int toId = scr.nextInt() - 1;
            int value = scr.nextInt();

            Vertax from = vertaxes.get(fromId);
            Vertax to = vertaxes.get(toId);

            from.linkedVertaxes.add(new Edge(toId, value));
            to.linkedVertaxes.add(new Edge(fromId, value));

            edges.get(fromId).put(toId, value);
            edges.get(toId).put(fromId, value);
        }

        int answer = doAlgorithm(vertaxes, vertaxes.get(0), 0);

        System.out.println(answer);
    }

    public static int doAlgorithm(List<Vertax> vertaxes, Vertax start, int total) {
        PriorityQueue<Edge> pq = new PriorityQueue<>((Edge e1, Edge e2) -> e1.value - e2.value);
        start.isVisited = true;
        start.linkedVertaxes.forEach((Edge e) -> {
            pq.add(e);
        });

        while(!pq.isEmpty()) {
            Edge e = pq.poll();
            Vertax to = vertaxes.get(e.toId);
            if(to.isVisited) {
                continue;
            }

            to.isVisited = true;
            total += e.value;
            to.linkedVertaxes.forEach((Edge e1) -> {
                if(!vertaxes.get(e1.toId).isVisited) {
                    pq.add(e1);
                }
            });
        }

        return total;
    }
}
Comments