import java.io.*;
import java.util.*;
public class Main {
static List<Integer>[] graph;
static boolean[] visited;
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());
// 초기화
graph = new ArrayList[N+1];
for(int i = 0; i < N+1; i++) {
graph[i] = new ArrayList<>();
}
// 양방향 연결
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
graph[x].add(y);
graph[y].add(x);
}
st = new StringTokenizer(br.readLine());
visited = new boolean[N+1];
int C = Integer.parseInt(st.nextToken());
int start = bfs(C);
int H = Integer.parseInt(st.nextToken());
bfs(H);
int T = Integer.parseInt(st.nextToken());
List<Integer> list = new ArrayList<>();
for(int j = 1; j < N+1; j++) {
if(!visited[j]) {
list.add(bfs(j));
}
}
Collections.sort(list, Collections.reverseOrder());
int res = 0;
for(int i = 0; i < T; i++) {
res += list.get(i);
}
System.out.println(res + start);
}
static int bfs(int target) {
int cnt = 1;
visited[target] = true;
Queue<Integer> q = new ArrayDeque<>();
q.offer(target);
while(!q.isEmpty()) {
for(int next : graph[q.poll()]) {
if(!visited[next]) {
visited[next] = true;
q.offer(next);
cnt++;
}
}
}
return cnt;
}
}
start 변수로 연결 요소 크기 저장T개만 선택하여 크기 합산start + 상위 T개의 연결 요소 크기 합list.get(i)에서 예외 가능성 있음for(int i = 0; i < T; i++) {
res += list.get(i);
}list.size() < T인 경우 IndexOutOfBoundsException 발생 가능
→ 안전하게 고치는 방법:
for(int i = 0; i < Math.min(T, list.size()); i++) {
res += list.get(i);
}
graph = new ArrayList[N+1]; 보다는 graph = new ArrayList[N + 1];로 띄어쓰기 일관성 유지 ( 진짜 별결다 트집)
Collections.sort(..., Collections.reverseOrder()) → 람다로 더 간결하게 쓸 수도 있음:
bfs VS dfs?
| 기준 | DFS | BFS |
|---|---|---|
| 연결 요소 크기 구하기 | 가능 | 가능 |
| 구현 난이도 (Java) | 재귀 사용 (스택 오버플로우 위험) | 큐 사용 (안전하고 직관적) |
| 노드 방문 순서 | 깊이 우선 | 너비 우선 |
| 방문 체크와 개수 세기 | 재귀 안에서 cnt++ 가능 | 큐 안에서 cnt++ 가능 |
| 성능 차이 | 거의 없음 | 거의 없음 |
이유:
BFS가 이 문제에서는 더 적절한 선택입니다.
- DFS도 기능적으로 가능하지만, Java에서는 BFS가 안정성과 가독성 면에서 유리
- 현재 코드도 BFS로 잘 짜여 있어서 유지하는 게 좋습니다.