![[java] 백준 24542번 문제(튜터-튜티 관계의 수)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbigZw4%2FbtsNMSlArIM%2FrzFQovkxMHgGzrbDnSsCiK%2Fimg.png)
[java] 백준 24542번 문제(튜터-튜티 관계의 수)자료구조 & 알고리즘/BOJ2025. 5. 7. 11:57
Table of Contents
원본 링크 : https://www.acmicpc.net/problem/24542
문제설명
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Boj_24542
{
static int[] parent;
static final int MOD = 1_000_000_007;
public static void main(String[] args) throws IOException
{
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());
parent = new int[n + 1];
for (int i = 1; i < n + 1; ++i) parent[i] = i;
for (int i = 0; i < m; ++i)
{
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
union(u, v);
}
// 각 집합의 크기를 직접 세고, 곱을 구함
int[] count = new int[n + 1];
for (int i = 1; i < n + 1; ++i) ++count[find(i)];
long result = 1;
for (int i = 1; i < n + 1; ++i)
if (parent[i] == i) // i가 대표 노드일 때만
result = (result * count[i]) % MOD;
System.out.println(result);
}
static void union(int a, int b)
{
int parentA = find(a);
int parentB = find(b);
if (parentA == parentB) return;
// 항상 더 작은 노드를 부모로 삼는다
if (parentA < parentB) parent[parentB] = parentA;
else parent[parentA] = parentB;
}
static int find(int x)
{
if (parent[x] != x) parent[x] = find(parent[x]);
return parent[x];
}
}
설명
- 유니온 파인드를 이용한다.
- 자세한 설명은 주석 참고
'자료구조 & 알고리즘 > BOJ' 카테고리의 다른 글
[java] 백준 18429번 문제(근손실) (0) | 2025.05.09 |
---|---|
[java] 백준 1976번 문제(여행 가자) (0) | 2025.05.07 |
[java] 백준 1717번 문제(집합의 표현) (0) | 2025.05.06 |
[java] 백준 1707번 문제(이분 그래프) (0) | 2025.04.28 |
[java] 백준 2667번 문제(단지번호붙이기) (1) | 2025.04.23 |