BFS

김민지·2022년 12월 28일
0

코딩테스트

목록 보기
5/31
post-custom-banner

6118

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

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String mn[] = br.readLine().split(" ");
        int n = Integer.parseInt(mn[0]);
        int m = Integer.parseInt(mn[1]);
        boolean []visited = new boolean[n+1];
        int []distance = new int[n+1];
        boolean[][]arr = new boolean[n+1][n+1];
        for(int i=0;i<m;i++){
            String input[] = br.readLine().split(" ");
            int x = Integer.parseInt(input[0]);
            int y = Integer.parseInt(input[1]);
            arr[x][y] = true;
            arr[y][x] = true;
        }
         Queue<Integer> q = new LinkedList<>();

        q.add(1);
        while(!q.isEmpty()){
            int k = q.poll();
            visited[k] = true;
                for(int i=1;i<=n;i++){
                    if(arr[k][i] && !visited[i]){
                        //만약 방문안한곳이고,내 인접한놈이면 재귀호춯한다
                        distance[i] = distance[k] + 1;
                        q.add(i);
                        visited[i] = true;
                    }
                }
        }


        int max = distance[0];
        int maxIdx = 0;
        int eq = 0;
        for(int i=1;i<n+1;i++){
            if(max < distance[i]) {
                max = distance[i];
                maxIdx = i;
            }

        }
        for(int i=1;i<n+1;i++){
            if(max == distance[i]) {
                eq++;
            }

        }
        System.out.println(maxIdx + " " + max + " " + eq );
    }
}

인접행렬로 풀었었다. 그런데 인접행렬로풀면 메모리 + 시간이 오래걸린다(nxn번을 다 확인해야하니)
인접행렬말고 이웃한것들만 리스트로 저장하면 훨씬 메모리 + 시간절약이된다

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

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String mn[] = br.readLine().split(" ");
        int n = Integer.parseInt(mn[0]);
        int m = Integer.parseInt(mn[1]);
        boolean []visited = new boolean[n+1];
        int []distance = new int[n+1];
        ArrayList<Integer> list[] = new ArrayList[n+1];
        for(int i=0;i<=n;i++){
            list[i] = new ArrayList<>();
        }
        for(int i=0;i<m;i++){
            String input[] = br.readLine().split(" ");
            int x = Integer.parseInt(input[0]);
            int y = Integer.parseInt(input[1]);
            list[x].add(y);
            list[y].add(x);
        }
        Queue<Integer> q = new LinkedList<>();

        q.add(1);
        while(!q.isEmpty()){
            int k = q.poll();
            visited[k] = true;
            for (int x:list[k]) {
                if(!visited[x]){
                    distance[x] = distance[k] + 1;
                    q.add(x);
                    visited[x] = true;
                }
            }
        }


        int max = distance[0];
        int maxIdx = 0;
        int eq = 0;
        for(int i=1;i<n+1;i++){
            if(max < distance[i]) {
                max = distance[i];
                maxIdx = i;
            }

        }
        for(int i=1;i<n+1;i++){
            if(max == distance[i]) {
                eq++;
            }

        }
        System.out.println(maxIdx + " " + max + " " + eq );
    }
}

1261


나는 block을 빼낸 point에서 ++만시켰다.

profile
안녕하세요!
post-custom-banner

0개의 댓글