투로드
Coder ToLoad
투로드
전체 방문자
오늘
어제

블로그 메뉴

  • 홈
  • 알고리즘
  • CS
  • GITHUB
  • 태그
  • 분류 전체보기 (69)
    • Toy Project (0)
      • EternalSNS (0)
    • Algorithm (46)
      • BaekJoon (38)
      • Programmers (7)
      • Code Tree (1)
    • Computer Science (13)
      • JAVA (7)
      • DataBase (4)
    • Backend (7)
      • Spring (2)
      • JPA (2)
      • Django (3)
    • Mobile (2)
      • Android (2)
    • Unity (1)

인기 글

최근 글

hELLO · Designed By 정상우.
투로드

Coder ToLoad

Algorithm/BaekJoon

[JAVA] 백준 1240 : 노드사이의 거리

2021. 4. 23. 21:19
문제
 

1240번: 노드사이의 거리

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

www.acmicpc.net

해결 방법

가중치가 있는 트리의 탐색 문제의 기본이다.

class를 이용해서 다음 방문할 위치와 거리를 입력해두고 탐색하면서 거리를 계속 더 해주면 된다.

탐색은 BFS를 사용했다.

 

간선을 입력할 때 양쪽으로 이동이 가능하게끔 쌍방향으로 리스트에 넣어주어야 한다.

 

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

public class Main {
	static int N;
	static ArrayList<Node> list[];
	static boolean visit[];
	

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        
        list = new ArrayList[N + 1];
        for (int i = 1; i <= N; i++) {
        	list[i] = new ArrayList<>();
        }
        
        for (int i = 0; i < N - 1; i++) {
        	st = new StringTokenizer(br.readLine(), " ");
        	int start = Integer.parseInt(st.nextToken());
        	int end = Integer.parseInt(st.nextToken());
        	int cost = Integer.parseInt(st.nextToken());
        	
        	list[start].add(new Node(end, cost));
        	list[end].add(new Node(start, cost));
        }
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < M; i++) {
        	st = new StringTokenizer(br.readLine(), " ");
        	int start = Integer.parseInt(st.nextToken());
        	int end = Integer.parseInt(st.nextToken());
        	sb.append(find(start, end) + "\n");
        }
        System.out.println(sb);
    }
    static int find(int start, int end) {
    	visit = new boolean[N + 1];
    	Queue<Node> q = new LinkedList<>();
    	q.offer(new Node(start, 0));
    	visit[start] = true;
    	
    	int dist = 0;
    	while(!q.isEmpty()) {
    		Node node = q.poll();
    		if (node.next == end) {
    			dist = node.dist;
    			break;
    		}
    		
    		for (Node temp : list[node.next]) {
    			if (!visit[temp.next]) {
    				q.offer(new Node(temp.next, node.dist + temp.dist));
    				visit[temp.next] = true;
    			}
    		}
    	}
    	
    	return dist;
    }
}

class Node {
	int next;
	int dist;
	
	Node (int next, int dist) {
		this.next = next;
		this.dist = dist;
	}
}

'Algorithm > BaekJoon' 카테고리의 다른 글

[JAVA] 백준 2151 : 거울 설치  (2) 2021.05.25
[JAVA] 백준 11657 : 타임머신  (0) 2021.05.04
[JAVA] 백준 8972 : 미친 아두이노  (0) 2021.04.21
[JAVA] 백준 11967 : 불켜기  (0) 2021.04.20
[JAVA] 백준 13335 : 트럭  (0) 2021.04.20
    'Algorithm/BaekJoon' 카테고리의 다른 글
    • [JAVA] 백준 2151 : 거울 설치
    • [JAVA] 백준 11657 : 타임머신
    • [JAVA] 백준 8972 : 미친 아두이노
    • [JAVA] 백준 11967 : 불켜기
    투로드
    투로드
    훌륭한 프로그래머가 되어가는 과정을 담아보는 중입니다.

    티스토리툴바