팡세영
Log sey
팡세영
전체 방문자
오늘
어제
  • 분류 전체보기 (73)
    • PS (45)
      • programmers (13)
      • 백준 (29)
    • Android (16)
    • Daily (0)
    • Kotlin (6)
    • Design Pattern (1)
    • Java (1)
    • Flutter (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • java
  • 자바
  • Android
  • programmers #프로그래머스
  • TestCode
  • 정렬
  • 해쉬맵
  • binding
  • 완전탐색
  • Kotlin
  • 백준
  • 코틀린
  • 안드로이드
  • compose
  • 실버
  • 구현
  • BFS
  • 프로그래머스
  • mvvm
  • LEVEL2
  • ArcitecturePattern
  • 의존성 주입
  • CustomView
  • 골드
  • DFS
  • flutter
  • 이분탐색
  • 하단네비게이션바
  • 문자열
  • programmers

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
팡세영

Log sey

[백준] 노드 사이 거리 (1240) - Java, bfs
PS/백준

[백준] 노드 사이 거리 (1240) - Java, bfs

2022. 7. 5. 02:01

https://www.acmicpc.net/problem/1240

 

1240번: 노드사이의 거리

N(2≤N≤1,000)개의 노드로 이루어진 트리가 주어지고 M(M≤1,000)개의 두 노드 쌍을 입력받을 때 두 노드 사이의 거리를 출력하라.

www.acmicpc.net

[입력]

첫 번째 라인은 노드의 개수와 거리를 알고 싶은 노드의 쌍의 수가 주어진다.

두 번째 라인부터 N-1개의 줄에 노드의 쌍과 거리가 주어진다.

그 다음 라인부터는 거리를 알고 싶은 M개의 노드의 쌍이 주어진다.

 

 

[문제 해결]

  • 노드를 양방향 연결을 한다.
  • 시작점을 큐에 넣고 방문 처리를 해준다.
  • bfs를 돌리면서  인접 노드들의 거리를 계산해준다. 
  • 마지막 노드에 도착하면 종료한다.

입력을 받고 난 후의 그래프 관계도



예제 케이스 3 <-> 2

[Java - bfs]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;


public class Main {

    static int distance[][];
    static boolean visited[];
    static int [][] node;

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

        int nodeNum = Integer.parseInt(st.nextToken());
        int wantNum = Integer.parseInt(st.nextToken());

        node = new int [nodeNum+1][nodeNum+1];
        distance = new int[nodeNum+1][nodeNum+1];

        // init Node
        for(int i=0; i<nodeNum-1; i++){
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int dis = Integer.parseInt(st.nextToken());
            node[a][b] = 1;
            node[b][a] = 1;
            distance[a][b] = dis;
            distance[b][a] = dis;
        }

        // start bfs
        for(int i=0; i<wantNum; i++){
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b=  Integer.parseInt(st.nextToken());
            bfs(a, b, nodeNum);
        }
    }

    public static void bfs(int start, int end, int nodeNum){
        Queue<Integer> queue = new LinkedList<>();
        visited = new boolean[nodeNum+1];

        visited[start] = true;
        queue.add(start);
        int ans[] = new int[nodeNum+1];

        while(!queue.isEmpty()){
            int cur = queue.poll();

            for(int i=1; i<=nodeNum; i++){

                if(node[cur][i] == 1 && !visited[i]){       // 만약 연결되어 있고 방문하지 않은 노드이면
                    ans[i] += distance[cur][i] + ans[cur];  // 거리를 갱신해준다.

                    if(i == end){           // 만약 마지막 노드이면 종료
                        System.out.println(ans[end]);
                        return;
                    }

                    queue.add(i);
                    visited[i] = true;
                }
            }
        }

    }



}

'PS > 백준' 카테고리의 다른 글

[백준] 추월 (2002) - Java  (0) 2022.07.08
[백준] Cupid (16460) - Java  (0) 2022.07.07
[백준 17264] I AM IRONMAN  (0) 2022.06.28
백준 촌수 계산(2644)  (0) 2022.06.27
백준 볼링 점수 계산(17215)  (0) 2022.06.27
    'PS/백준' 카테고리의 다른 글
    • [백준] 추월 (2002) - Java
    • [백준] Cupid (16460) - Java
    • [백준 17264] I AM IRONMAN
    • 백준 촌수 계산(2644)
    팡세영
    팡세영
    Android, CS, PS

    티스토리툴바