뮁이의 개발새발

[JAVA] 백준 1922 네트워크 연결 (MST 알고리즘) 본문

Algorithm

[JAVA] 백준 1922 네트워크 연결 (MST 알고리즘)

뮁뮁이 2021. 9. 7. 23:48
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class bj1922 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(in.readLine()); // 컴퓨터의 수
		int M = Integer.parseInt(in.readLine()); // 선의 수

		int[][] map = new int[N + 1][N + 1];
		int[] minEdge = new int[N + 1];
		boolean[] visited = new boolean[N + 1];

		for (int i = 0; i < M; i++) {
			StringTokenizer st = new StringTokenizer(in.readLine(), " ");
			int a = Integer.parseInt(st.nextToken()); // a부터
			int b = Integer.parseInt(st.nextToken()); // b까지
			int c = Integer.parseInt(st.nextToken()); // 비용

			map[a][b] = map[b][a] = c;
		}

		for (int i = 1; i <= N; i++) {
			minEdge[i] = Integer.MAX_VALUE;
		}

		int result = 0; // 최소신장트리 비용
		minEdge[1] = 0; // 임의의 시작점 0의 간선비용을 0으로 세팅

		for (int i = 1; i <= N; i++) {
			// 1. 신장트리에 포함되지 않은 정점 중 최소간선비용의 정점 찾기
			int min = Integer.MAX_VALUE;
			int minVertex = -1; // 최소간선비용의 정점번호
			for (int j = 1; j <= N; j++) {
				if (!visited[j] && min > minEdge[j]) {
					min = minEdge[j];
					minVertex = j;
				}
			}

			visited[minVertex] = true; // 신장트리에 포함시킴
			result += min; // 간선비용 누적

			// 2. 선택된 정점 기준으로 신장트리에 연결되지 않은 타 정점과의 간선 비용 최소로 업데이트
			for (int j = 1; j <= N; j++) {
				if (!visited[j] && map[minVertex][j] != 0 && minEdge[j] > map[minVertex][j]) {
					minEdge[j] = map[minVertex][j];
				}
			}
		}

		System.out.println(result);
	}
}
Comments