while(1) work();
반응형

링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15PTkqAPYCFAYD

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

분류

트리

LCA 알고리즘

 

개인적 난이도

매우 쉬움 쉬움 보통 어려움 매우 어려움

 

핵심 알고리즘

LCA 알고리즘을 통해 공통 조상을 찾으면 된다.

 

시행착오

없음

 

코드

import java.util.*;
import java.io.*;

class Solution{
	static Node[] tree;

	public static void main(String args[]) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());

		for(int tc = 1; tc <= T; ++tc){
			String[] arr = br.readLine().split(" ");
			int N = Integer.parseInt(arr[0]), E = Integer.parseInt(arr[1]), V1 = Integer.parseInt(arr[2]), V2 = Integer.parseInt(arr[3]);
			tree = new Node[N + 1];
			arr = br.readLine().split(" ");

			for (int i = 0; i < E; i++){
				int v1 = Integer.parseInt(arr[i * 2]), v2 = Integer.parseInt(arr[i * 2 + 1]);

				if (tree[v1] == null) tree[v1] = new Node(v1, -1);
				if (tree[v2] == null) tree[v2] = new Node(v2, -1);

				tree[v1].children.add(v2);
				tree[v2].parent = v1;
			}

			tree[1].setDep(1);

			if (tree[V1].dep > tree[V2].dep){ //V2가 더 깊어야 함
				int tmp = V1;
				V1 = V2;
				V2 = tmp;
			}

			while (tree[V1].dep != tree[V2].dep) {
				V2 = tree[V2].parent;
			}

			while (V1 != V2) {
				V1 = tree[V1].parent;
				V2 = tree[V2].parent;
			}

			System.out.println("#" + tc + " " + V1 + " " + tree[V1].cnt);
		}
	}

	public static class Node{
		int v, dep = 0, parent, cnt = 0;
		List<Integer> children = new ArrayList<Integer>();

		public Node(int v, int parent){
			this.v = v;
			this.parent = parent;
		}

		public int setDep(int dep){
			this.dep = dep;
			int cnt = 1;

			for (int i = 0; i < children.size(); i++){
				cnt += tree[children.get(i)].setDep(dep + 1);
			}

			this.cnt = cnt;

			return cnt;
		}
	}
}
반응형

'알고리즘 > SW Expert Academy' 카테고리의 다른 글

3000. 중간값 구하기  (0) 2022.02.16
1249. 보급로  (0) 2022.02.16
1232. 사칙연산  (0) 2022.02.16
1233. 사칙연산 유효성 검사  (0) 2022.02.16
1251. 하나로  (0) 2022.02.16
profile

while(1) work();

@유호건

❤️댓글은 언제나 힘이 됩니다❤️ 궁금한 점이나 잘못된 내용이 있다면 댓글로 남겨주세요.

검색 태그