• 문제 링크
1197번: 최소 스패닝 트리
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이
www.acmicpc.net
• 풀이 과정
[백준] 1922 네트워크 연결 - Graph Theory / Java
• 문제 링크 1922번: 네트워크 연결 이 경우에 1-3, 2-3, 3-4, 4-5, 4-6을 연결하면 주어진 output이 나오게 된다. www.acmicpc.net • 풀이 과정 그래프(네트워크) 내의 모든 정점(컴퓨터)을 가장 적은 비용
graycode.tistory.com
위 문제와 입력 형식 외에 동일한 문제이다.
최소 스패닝 트리(Minimum Spanning Tree) 를 구하기 위하여 크루스칼 알고리즘을 사용한다.
간선의 정보(출발 노드, 도착 노드, 가중치) 를 저장하는 Edge 클래스를 생성,
가중치를 오름차순 정렬 기준으로 지정한다.
부모 노드 값을 저장하는 parent 배열을 생성하고
find 함수를 통해 간선의 두 노드의 부모 노드 일치 여부(싸이클 존재 여부) 를 확인한다.
사이클이 없을 경우 union 함수로 연결하고 최소 비용을 누적시켜 정답으로써 출력한다.
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static int[] parent;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int v = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
parent = new int[v + 1];
for (int i = 1; i <= v; i++)
parent[i] = i;
List<Edge> list = new ArrayList<>();
for (int i = 0; i < e; i++) {
st = new StringTokenizer(br.readLine());
int src = Integer.parseInt(st.nextToken());
int dest = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
list.add(new Edge(src, dest, weight));
}
Collections.sort(list);
int cost = 0;
for (int i = 0; i < e; i++) {
Edge edge = list.get(i);
if (find(edge.src) != find(edge.dest)) {
cost += edge.weight;
union(edge.src, edge.dest);
}
}
bw.write(cost + "\n");
bw.flush();
}
private static int find(int node) {
if (node == parent[node])
return node;
return parent[node] = find(parent[node]);
}
private static void union(int src, int dest) {
src = find(src);
dest = find(dest);
if (src != dest)
parent[dest] = src;
}
private static class Edge implements Comparable<Edge> {
int src, dest, weight;
public Edge(int src, int dest, int weight) {
this.src = src;
this.dest = dest;
this.weight = weight;
}
@Override
public int compareTo(Edge o) {
return weight - o.weight;
}
}
}
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 1865 웜홀 - Graph Theory / Java (0) | 2022.08.18 |
---|---|
[백준] 11657 타임머신 - Graph Theory / Java (0) | 2022.08.17 |
[백준] 1922 네트워크 연결 - Graph Theory / Java (0) | 2022.08.15 |
[백준] 2056 작업 - Graph Theory / Java (0) | 2022.08.14 |
[백준] 1766 문제집 - Graph Theory / Java (0) | 2022.08.13 |
댓글