[백준] 2644번: 촌수계산

ByWindow·2021년 7월 26일
0

Algorithm

목록 보기
36/104
post-thumbnail

📝문제

많이 풀어봤던 유형이었다.
보자마자 BFS로 풀어야겠다고 생각했고, 각 사람을 방문한 배열을 만들어서 해당 사람(인덱스)에 몇 번 edge를 건넜는지 표시하면 될 것 같았다.
당연히 그 전 사람의 값에서 1씩을 더해주면서 이동한다.

📌코드

package Baekjoon;

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

public class BOJ2644 {

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        /**
         * bfs로 풀자
         */
        int n = Integer.parseInt(st.nextToken()); //사람 수
        st = new StringTokenizer(br.readLine());
        int start = Integer.parseInt(st.nextToken()); //촌수계산할 사람1
        int end = Integer.parseInt(st.nextToken()); //촌수계산할 사람2
        st = new StringTokenizer(br.readLine());
        int m = Integer.parseInt(st.nextToken());//edge 수

        int[] visited = new int[n+1];
        boolean[][] map = new boolean[n+1][n+1];
        Queue<Integer> q= new LinkedList<>();

        for(int i = 0; i < m; i++){
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            map[x][y] = map[y][x] = true; //연결되어 있는 것 기록
        }
        q.add(start);
        while(!q.isEmpty()){
            int cur = q.poll();
            for(int i = 1; i <= n; i++){
                //촌수관계인지 검사
                //예외 : 방문햇던 곳, 시작점인 곳
                if(visited[i] != 0) continue;
                if(i == start) continue;
                if(map[cur][i]) {
                    q.add(i);
                    visited[i] = visited[cur] + 1;
                }
            }
        }
        System.out.println(visited[end] == 0 ? -1 : visited[end]);
    }
}
profile
step by step...my devlog

0개의 댓글