티스토리 뷰
728x90
풀이 및 소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;
public class Solution {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for (int t = 1; t <= T; t++) {
st = new StringTokenizer(br.readLine());
int v = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken())-1;
int y = Integer.parseInt(st.nextToken())-1;
List<Integer>[] g = new LinkedList[v];
// 부모와 자식을 연결하는 그래프. 조상을 거슬러 올라가 찾아야하기 때문에 반대로 담아줄 것임
List<Integer>[] origin_g = new LinkedList[v];
for(int i=0;i<v;i++) {
g[i] = new LinkedList<Integer>();
origin_g[i] = new LinkedList<Integer>();
}
// 초기화
st = new StringTokenizer(br.readLine());
for(int i=0;i<e;i++) {
int a = Integer.parseInt(st.nextToken())-1;
int b = Integer.parseInt(st.nextToken())-1;
origin_g[a].add(b);
g[b].add(a);
}
boolean[] x_v = new boolean[v];
boolean[] y_v = new boolean[v];
// 방문처리 겸 겹치는 조상 찾기
Queue<Integer> q = new LinkedList<>();
// x의 조상들 찾기
q.add(x);
x_v[x] = true;
while(!q.isEmpty()) {
int p = q.poll();
for(int c:g[p]) {
if(x_v[c]) continue;
x_v[c] = true;
q.add(c);
}
}
// y의 조상들 찾기 겸, x와 겹치는 조상 찾기
q = new LinkedList<>();
q.add(y);
y_v[y] = true;
int common_p = -1;
outer:while(!q.isEmpty()) {
int p = q.poll();
for(int c:g[p]) {
if(y_v[c]) continue;
if(x_v[c]) {
// 겹치는 조상을 찾았다면, 종료
common_p = c;
break outer;
}
x_v[c] = true;
q.add(c);
}
}
// 겹치는 가장 가까운 조상의 서브트리 개수 구하기
int cnt = 1;
q = new LinkedList<>();
q.add(common_p);
y_v = new boolean[v];
// 방문처리를 위해 배열 재활용하기
y_v[common_p] = true;
outer:while(!q.isEmpty()) {
int p = q.poll();
for(int c:origin_g[p]) {
y_v[c] = true;
q.add(c);
cnt ++;
}
}
sb.append("#").append(t).append(" ").append((common_p+1)).append(" ").append(cnt).append("\n");
}
System.out.println(sb);
}
}
반응형
'Coding - Algo > Java' 카테고리의 다른 글
[백준] 3425번:고스택(Java 자바) (0) | 2022.03.07 |
---|---|
[SWEA] 1233:사칙연산 유효성 검사(Java 자바) (0) | 2022.03.04 |
[SWEA] 1221:GNS(Java 자바) (0) | 2022.03.04 |
[SWEA] 1215:회문1(Java 자바) (0) | 2022.03.04 |
[SWEA] 1213:String(Java 자바) (0) | 2022.03.04 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- ubuntu
- 우분투
- swea 타일링 자바
- 타일링 자바
- 삼성청년SW아카데미
- 더 맵게
- 백준 dp 문제
- swea 1240 자바
- 프로그래머스 자바
- yoloV3
- 프로그래머스
- 1699 자바
- SWEA
- 파이썬 풀이
- 백준
- 백준파이썬
- SSAFY
- swea 1240
- 1240 자바
- swea 4070 타일링
- 백준 17144
- 파이썬
- 프로그래머스 더 맵게
- swea 타일링
- poker swea
- union-find
- 3996 자바
- 백준 풀이
- 프로그래머스 파이썬
- 메뉴리뉴얼 풀이
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함