본문 바로가기

알고리즘/BFS

백준 - 촌수 계산

본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.
저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.

문의는 댓글 바람.

문제 출처 : https://www.acmicpc.net/problem/2644

[문제 설명]

촌수 구하기

[접근 방법]

BFS로 걸리는 거리가 촌수다.

[내 답안 수정하기]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int numOfFamily = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        int targetParrent = Integer.parseInt(st.nextToken());
        int targetChild = Integer.parseInt(st.nextToken());
        List<List<Integer>> relations = new ArrayList<>();
        int cntOfRelations = Integer.parseInt(br.readLine());
        boolean[][] visited = new boolean[numOfFamily+1][numOfFamily+1];

        for (int i = 0; i <= numOfFamily; i++) { relations.add(new ArrayList<>());}
        for (int realationNo = 1; realationNo <= cntOfRelations; realationNo++) {
            st = new StringTokenizer(br.readLine(), " ");
            int parent = Integer.parseInt(st.nextToken());
            int child = Integer.parseInt(st.nextToken());

            relations.get(parent).add(child);
            relations.get(child).add(parent);
        }

        Queue<List<Integer>> queue = new LinkedList<>();
        queue.offer(relations.get(targetParrent));
        int range = 1;
        while(!queue.isEmpty()) {
            int size = queue.size();
            while (size-- > 0) {
                List<Integer> temp = queue.poll();
                for (int familyNo : temp) {
                    if (familyNo == targetChild) {
                        System.out.println(range);
                        return;
                    }

                    if (!visited[familyNo][targetChild]) {
                        queue.offer(relations.get(familyNo));
                    }
                    visited[familyNo][targetChild] = true;
                    visited[targetChild][familyNo] = true;
                }
            }

            range++;
        }
        System.out.println(-1);
    }
}
728x90
반응형

'알고리즘 > BFS' 카테고리의 다른 글

백준 - 토마토(Kotlin)  (0) 2022.03.30
백준 - 나이트의 이동  (0) 2022.01.04
404. Sum of Left Leaves  (0) 2021.09.09
463. Island Perimeter  (0) 2021.09.01
965. Univalued Binary Tree  (0) 2021.09.01