반응형
백준 14675번 문제 - 단절점과 단절선
14675번: 단절점과 단절선
프로그램의 입력은 표준 입력으로 받는다. 입력의 첫 줄에는 트리의 정점 개수 N이 주어진다. (2 ≤ N ≤ 100,000) 트리의 정점은 1번부터 n번까지 존재한다. 다음 줄부터 N-1개의 줄에 걸쳐 간선의 정
www.acmicpc.net
문제 분석
- 트리에서 해당 점이 단절점인지, 해당 선이 단절선인지 유무를 출력한다.
- 단절점(cut vertex) : 해당 정점을 제거하였을 때, 그 정점이 포함된 그래프가 2개 이상으로 나뉘는 경우
- 단절선(bridge) : 해당 간선을 제거하였을 때, 그 간선이 포함된 그래프가 2개 이상으로 나뉘는 경우
해결 키 포인트
- 각 정점에 연결된 정점 정보를 ArrayList로 제작한다.
- 질문에 대한 답을 출력한다.
- 단절점인가(1 k) : 정점(k)이 연결된 정점의 개수가 2보다 크거나 같으면 yes, 아니면 no
- 단절선인가(2 k) : 문제 조건이 사이클이 존재하지 않고 모든 정점이 연결된 트리이므로 간선은 무조건적으로 단절선으로 yes
코드
import java.io.*;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// N 입력
int N = Integer.parseInt(br.readLine());
// 각 정점에 연결되 있는 점 리스트
ArrayList<Integer> [] lists = new ArrayList [N];
for(int i=0;i<N;i++) {
lists[i] = new ArrayList<>();
}
// 간선 입력
for(int i=0;i<N-1;i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken())-1;
int b = Integer.parseInt(st.nextToken())-1;
lists[a].add(b);
lists[b].add(a);
}
// 질문 개수 Q 입력
int Q = Integer.parseInt(br.readLine());
// 질문 답변
for(int i=0;i<Q;i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int t = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken())-1;
// k가 단절점인지 체크
if(t == 1) {
// 해당 점이 2개 이상과 연결되 있는 경우, 단절점 O
if(lists[k].size() >= 2){
bw.write("yes\n");
// 아닌 경우, 단절점 X
}else {
bw.write("no\n");
}
}
// k번째 간선이 단절선인지 체크
else {
// 현재 문제 조건이 트리인 경우이므로, 모든 간선이 단절선
bw.write("yes\n");
}
}
bw.flush();
bw.close();
}
}
반응형
'CodingTEST' 카테고리의 다른 글
[프로그래머스] 네트워크 (JAVA) (1) | 2023.10.11 |
---|---|
[프로그래머스] 게임 맵 최단거리 (JAVA) (2) | 2023.09.19 |
[백준 7662] 이중 우선순위 큐 (JAVA) (0) | 2023.09.19 |
[백준 4358] 생태학 (JAVA) (0) | 2023.09.19 |
[백준 1516] 게임 개발 (JAVA) (0) | 2023.08.29 |