
N๊ฐ์ ๋ง์๊ณผ ๊ทธ ๋ง์์ ์ฐ๊ฒฐํ๋ M๊ฐ์ ๊ธธ์ด ์๋ค. ์ด ๋ง์์ ๋ ๊ฐ๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ๊ณ ์ถ๋ค. ์ต์์ ๊ธธ๋ง ์กด์ฌํ๊ฒ ํ๋ฉด์ ๊ธธ์ ์ ์ง๋น๊ฐ ์ต์๊ฐ ๋๋๋ก ํ์ฌ๋ผ. ๋ถ๋ฆฌ๋ ๋ ๋ง์ ์ฌ์ด์๋ ๊ธธ์ด ์๋ค.
์ด ๋ฌธ์ ๋ ๊ฒฐ๊ตญ ๋ง์์ ๋ชจ๋ ์ง์ ์ฐ๊ฒฐํ๋ฉด์ ์ด ์ ์ง๋น๋ฅผ ์ต์๋ก ๋ง๋๋ ๋ฌธ์ ์ด๋ฏ๋ก, ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ณผ์ ๊ณผ ๊ฐ๋ค. ์ด MST๋ฅผ ๋ ๊ฐ์ ๋ง์๋ก ๋๋๊ธฐ ์ํด์๋, MST๋ฅผ ์ด๋ฃจ๋ ๊ฐ์ ์ค ๊ฐ์ฅ ๋น์ผ ๊ฐ์ ํ๋๋ฅผ ์ ๊ฑฐํ๋ฉด ๋๋ค.
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก MST๋ฅผ ๋ง๋ค ์ ์๋ค.
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ ํ๋์ ์ ์ ์์ ์ฐ๊ฒฐ๋ ๊ฐ์ ๋ค ์ค์์ ํ๋์ฉ ์ ํํ๋ฉด์ MST๋ฅผ ๋ง๋ค์ด๊ฐ๋ ๋ฐฉ์์ด๋ค.
๋ง์์ ์ง(์ ์ ) ๊ฐ์ N๊ณผ ๊ธธ(๊ฐ์ )์ ๊ฐ์ M์ ์ ๋ ฅ๋ฐ๋๋ค.
๊ฐ์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด Edge ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ๊ฐ์ ์ ๋์ฐฉ์ง to์ ์ ์ง๋น(๊ฐ์ค์น) path๋ฅผ ๋ด๋๋ค.
PriorityQueue๊ฐ ๋น์ฉ์ด ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ ์ ์๋์ผ๋ก ์ ํํ๋๋ก, Edge ํด๋์ค์ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
๊ฐ ์ง๊ณผ ์ฐ๊ฒฐ๋ ๊ธธ๋ค์ ์ ์ฅํ๊ธฐ ์ํด ์ธ์ ๋ฆฌ์คํธ์ธ List<Edge>[] home์ ์ด๊ธฐํํ๋ค.
M๊ฐ์ ๊ฐ์ ์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ์ home ๋ฆฌ์คํธ์ ์๋ฐฉํฅ์ผ๋ก ์ถ๊ฐํ๋ค.
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ ์ฐ์ ์์ ํ(PriorityQueue)์ ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ ์ฌ์ฉํด ๋น์ฉ์ด ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ ๋ถํฐ ํ๋์ฉ ์ถ๊ฐํ๋ฉฐ MST๋ฅผ ๋ง๋ค์ด ๋๊ฐ๋ ๋ฐฉ์์ด๋ค.
boolean[] visited ๋ฐฐ์ด์ ๋ง๋ค์ด ๋ฐฉ๋ฌธํ ์ง์ ์ฒดํฌํ๋ค.
PriorityQueue<Edge> pq๋ฅผ ์์ฑํ๋ค. ์ด ํ๋ ํญ์ ๋น์ฉ์ด ๊ฐ์ฅ ์ ์ ๊ฐ์ ์ ์ฐ์ ์ผ๋ก ๊บผ๋ด์ค๋ค.
์์์ ์์์ (์: 1๋ฒ ์ง)์ ์ ํด visited ๋ฐฐ์ด์ true๋ก ๋ฐ๊พธ๊ณ , ์ด ์ง๊ณผ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๊ฐ์ ์ pq์ ๋ฃ๋๋ค.
๋ฐ๋ณต๋ฌธ: MST๋ฅผ ์์ฑํ๊ธฐ ์ํด N-1๊ฐ์ ๊ฐ์ ์ ์ ํํ ๋๊น์ง ๋ค์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
1) pq์์ ๊ฐ์ฅ ๋น์ฉ์ด ์ ์ ๊ฐ์ e๋ฅผ ๊บผ๋ธ๋ค.
2) e์ ๋์ฐฉ์ง e.to๊ฐ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ง์ด๋ผ๋ฉด, ์ด๋ฏธ ๋ ์ ๋ ดํ ๊ฒฝ๋ก๊ฐ ์๋ค๋ ๋ป์ด๋ฏ๋ก ์ด ๊ฐ์ ์ ๋ฒ๋ฆฌ๊ณ ๋ค์ ๊ฐ์ ์ ๊บผ๋ธ๋ค.
3) ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ง์ด๋ผ๋ฉด, ์ด ๊ฐ์ ์ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ์ผ๋ถ๋ก ์ ํํ๋ค.
4) e.to๋ฅผ visited ์ฒ๋ฆฌํ๊ณ , ์ ํํ ๊ฐ์ ์ ๋น์ฉ(e.path)์ costs ๋ฆฌ์คํธ์ ์ ์ฅํ๋ค.
5) ๋ง์ง๋ง์ผ๋ก, ์๋ก ๋ฐฉ๋ฌธํ e.to์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๊ฐ์ ๋ค์ pq์ ์ถ๊ฐํ์ฌ ๋ค์ ๋จ๊ณ์์ ํ์ํ ํ๋ณด์ ํฌํจ์ํจ๋ค.
์ ๋จ๊ณ์์ costs ๋ฆฌ์คํธ์ MST๋ฅผ ๊ตฌ์ฑํ๋ N-1๊ฐ์ ๊ฐ์ ๋น์ฉ์ด ๋ชจ๋ ์ ์ฅ๋๋ค.
๋ง์์ ๋ ๊ฐ๋ก ๋๋๊ธฐ ์ํด, MST๋ฅผ ์ด๋ฃจ๋ ๊ฐ์ ๋ค ์ค ๊ฐ์ฅ ๋น์ฉ์ด ํฐ ๊ฐ์ ํ๋๋ฅผ ์ ๊ฑฐํ๋ค. ์ด ๊ฐ์ ์ ์ ๊ฑฐํ๋ฉด ๊ทธ๋ํ๋ ์์ฐ์ค๋ฝ๊ฒ ๋ ๊ฐ์ ์ฐ๊ฒฐ ์์(๋ง์)๋ก ๋๋๊ฒ ๋๋ค.
Collections.max(costs)๋ฅผ ์ฌ์ฉํด costs ๋ฆฌ์คํธ์์ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฐพ๋๋ค.
costs ๋ฆฌ์คํธ์ ๋ชจ๋ ๋น์ฉ์ ๋ํ ์ดํฉ์์ ๊ฐ์ฅ ํฐ ๋น์ฉ์ ๋นผ๋ฉด, ์ต์ข ์ ์ผ๋ก ๋ ๋ง์์ ์ ์งํ๋ ๋ฐ ๋๋ ์ต์ ๋น์ฉ์ ์ป์ ์ ์๋ค.
package study;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class ๋์๋ถํ ๊ณํ_1647 {
// ์ฐ์ ์์ ํ๋ก ๋ง๋ค๊ธฐ
static class Edge implements Comparable<Edge> { // Comparable ๋ฃ๋ ๊ฑธ ๊น๋จน์๋ค.
int to;
int path;
public Edge(int to, int path) {
super();
this.to = to;
this.path = path;
}
@Override
public int compareTo(Edge o) {
return this.path - o.path;
}
}
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
List<Edge>[] home = new ArrayList[N + 1];
for (int i = 1; i <= N; i++) {
home[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
int C = Integer.parseInt(st.nextToken());
home[A].add(new Edge(B, C));
home[B].add(new Edge(A, C));
}
// ์ต์์ ์ฅํธ๋ฆฌ ๋ง๋ค๊ธฐ
PriorityQueue<Edge> pq = new PriorityQueue<>();
boolean[] visited = new boolean[N + 1];
visited[1] = true;
int pick = 0;
List<Integer> costs = new ArrayList<>();
for (Edge e : home[1]) {
pq.add(e);
}
// N -1๊ฐ ๋ฝ์ ๋๊น์ง ๋ฐ๋ณต
while (pick < N - 1) {
Edge e = pq.poll(); // ๋น์ฉ์ด ๊ฐ์ฅ ์ ์ ๊ฐ์ ์ ๊บผ๋ธ๋ค.
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ์ผ๋ฉด ๋์ด๊ฐ
if (visited[e.to]) {
continue;
}
visited[e.to] = true;
pick++;
costs.add(e.path);
pq.addAll(home[e.to]);'`
}
int maxCost = Collections.max(costs);
int totalCost = 0;
for (int i = 0; i < costs.size(); i++) {
totalCost += costs.get(i);
}
int ans = totalCost - maxCost;
System.out.println(ans);
}
}
์ ๋ง ๋นจ๋ฆฌ ํ์๋ค ๋ฏผ์น์ด๐