본문 바로가기

Algorithm

프림 알고리즘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class MST2_PrimTest {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[][] adjMatrix = new int[N][N];
        int[] minEdge = new int[N]; // 타 정점에서 자신으로의 간선비용 중 최소 비용
        boolean[] visited = new boolean[N]; // 신장 트리에 선택된 여부
        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                adjMatrix[i][j] = Integer.parseInt(st.nextToken());
            }
            minEdge[i] = Integer.MAX_VALUE; // 충분히 큰 값으로 최솟값 초기화
        }
 
        int result = 0;
        minEdge[0= 0// 0번 정점부터 시작, 자기 자신으로의 비용은 0
 
        for (int c = 0; c < N; c++) { // N개의 정점을 모두 연결
            int min = Integer.MAX_VALUE;
            int minVertex = 0;
            // 신장트리에 연결되지 않은 정점 중 가장 유리한 비용의 정점을 선택
            for (int i = 0; i < N; i++) {
                if (!visited[i] && min > minEdge[i]) {
                    min = minEdge[i];
                    minVertex = i;
                }
            }
            System.out.println(Arrays.toString(minEdge));
            System.out.println(minVertex);
            System.out.println();
            // 선택된 정점을 신장트리에 포함시킴
            visited[minVertex] = true;
            result += min;
 
            // 선택된 정점 기준으로 신장트리에 포함되지 않은 다른 정점으로의 간선 비용을 따져보고 최소값 갱신
            for (int i = 0; i < N; i++) {
                if (!visited[i] && adjMatrix[minVertex][i] != 0 && minEdge[i] > adjMatrix[minVertex][i]) {
                    minEdge[i] = adjMatrix[minVertex][i];
                }
            }
        }
        System.out.println(result);
    }
}
 
cs

'Algorithm' 카테고리의 다른 글

CCW(Counter Clock Wise) 알고리즘  (0) 2022.04.11
다익스트라 알고리즘  (0) 2022.04.01
크루스칼 알고리즘  (0) 2022.03.17
Union & Find 알고리즘  (0) 2022.03.17
KMP(Knuth-Morris-Pratt) 알고리즘  (0) 2022.03.10