From 0a45031724e2c415946572c25c83dea4852c97d5 Mon Sep 17 00:00:00 2001 From: lkhyun <102892446+lkhyun@users.noreply.github.com> Date: Fri, 5 Sep 2025 10:27:47 +0900 Subject: [PATCH] =?UTF-8?q?[20250905]=20BOJ=20/=20G4=20/=20=ED=8A=B8?= =?UTF-8?q?=EB=A6=AC=20/=20=EC=9D=B4=EA=B0=95=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../05 BOJ G4 \355\212\270\353\246\254.md" | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 "lkhyun/202509/05 BOJ G4 \355\212\270\353\246\254.md" diff --git "a/lkhyun/202509/05 BOJ G4 \355\212\270\353\246\254.md" "b/lkhyun/202509/05 BOJ G4 \355\212\270\353\246\254.md" new file mode 100644 index 00000000..9b3cbaba --- /dev/null +++ "b/lkhyun/202509/05 BOJ G4 \355\212\270\353\246\254.md" @@ -0,0 +1,72 @@ +```java +import java.util.*; +import java.io.*; + +public class Main{ + static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + static StringTokenizer st; + static StringBuilder sb = new StringBuilder(); + static int N,M; + static int T; + public static void main(String[] args) throws Exception { + T = 1; + while(true){ + st = new StringTokenizer(br.readLine()); + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + if(N == 0 && M == 0) break; + sb.append("Case ").append(T++).append(": " ); + + int[] parent = new int[N+1]; + for (int i = 1; i <= N; i++) { + parent[i] = i; + } + + Set cycles = new HashSet<>(); + + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + union(a, b, parent, cycles); + } + + Set s = new HashSet<>(); + for (int i = 1; i <= N; i++) { + s.add(find(i,parent)); + } + + for(int c : cycles){ + s.remove(find(c,parent)); + } + + if(s.size()==0){ + sb.append("No trees.\n"); + }else if(s.size()==1){ + sb.append("There is one tree.\n"); + }else{ + sb.append("A forest of ").append(s.size()).append(" trees.\n"); + } + } + bw.write(sb.toString()); + bw.close(); + } + public static int find(int cur, int[] parent){ + if(parent[cur] == cur) return cur; + else return parent[cur] = find(parent[cur],parent); + } + public static void union(int a, int b, int[] parent, Set cycles){ + int rootA = find(a,parent); + int rootB = find(b,parent); + + if(rootA < rootB){ + parent[rootA] = rootB; + }else if(rootA > rootB){ + parent[rootB] = rootA; + }else{ + cycles.add(rootA); + } + } +} +```