From 4a545a495e57f962e13aae1043b2eed07a73a1c0 Mon Sep 17 00:00:00 2001 From: Donew <47556347+03do-new30@users.noreply.github.com> Date: Tue, 1 Apr 2025 22:00:29 +0900 Subject: [PATCH] =?UTF-8?q?[20250401]=20BOJ=20/=20G3=20/=20=EC=9A=B0?= =?UTF-8?q?=EC=A3=BC=EC=8B=A0=EA=B3=BC=EC=9D=98=20=EA=B5=90=EA=B0=90=20/?= =?UTF-8?q?=20=EC=8B=A0=EB=8F=99=EC=9C=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\235\230 \352\265\220\352\260\220.md" | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 "03do-new30/202504/01 BOJ G3 \354\232\260\354\243\274\354\213\240\352\263\274\354\235\230 \352\265\220\352\260\220.md" diff --git "a/03do-new30/202504/01 BOJ G3 \354\232\260\354\243\274\354\213\240\352\263\274\354\235\230 \352\265\220\352\260\220.md" "b/03do-new30/202504/01 BOJ G3 \354\232\260\354\243\274\354\213\240\352\263\274\354\235\230 \352\265\220\352\260\220.md" new file mode 100644 index 00000000..733811f5 --- /dev/null +++ "b/03do-new30/202504/01 BOJ G3 \354\232\260\354\243\274\354\213\240\352\263\274\354\235\230 \352\265\220\352\260\220.md" @@ -0,0 +1,106 @@ +```java +import java.util.*; +import java.io.*; +import java.awt.Point; +public class Main { + + static int N, M; + static Point[] points; + static int[] parents; + static PriorityQueue pq; + + static class Edge implements Comparable{ + int from, to; + double wt; + public Edge(int from, int to, double wt) { + this.from = from; + this.to = to; + this.wt = wt; + } + + @Override + public int compareTo(Edge o) { + return Double.compare(this.wt, o.wt); + } + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + N = Integer.parseInt(st.nextToken()); // 정점의 개수 + M = Integer.parseInt(st.nextToken()); // 이미 연결된 통로의 개수 + + points = new Point[N+1]; + for (int i = 1; i < N+1; i++) { + st = new StringTokenizer(br.readLine()); + int x = Integer.parseInt(st.nextToken()); + int y = Integer.parseInt(st.nextToken()); + points[i] = new Point(x, y); + } + + makeSet(); + + for (int i = 0; i < M; i++) { + // 이미 연결된 정점들에 대해 union + st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + union(a, b); + } + + makePQ(); + double result = kruskal(); + System.out.printf("%.2f\n", result); + br.close(); + } + + static double kruskal() { + double result = 0.0; + while (!pq.isEmpty()) { + Edge e = pq.poll(); + if (union(e.to, e.from)) { + result += e.wt; + } + } + return result; + } + + static void makePQ() { + pq = new PriorityQueue<>(); + for (int i = 1; i < N; i++) { + for (int j = i+1; j < N+1; j++) { + pq.add(new Edge(i, j, getDist(points[i], points[j]))); + } + } + } + + static void makeSet() { + parents = new int[N+1]; + for (int i = 1; i < N+1; i++) { + parents[i] = i; + } + } + + static int find(int a) { + if (parents[a] == a) return a; + return parents[a] = find(parents[a]); + } + + static boolean union(int a, int b) { + int aRoot = find(a); + int bRoot = find(b); + if (aRoot == bRoot) return false; + if (aRoot < bRoot) { + parents[bRoot] = aRoot; + } else { + parents[bRoot] = aRoot; + } + return true; + } + + static double getDist(Point a, Point b) { + return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2)); + } +} + +```