반응형
https://www.acmicpc.net/problem/1240
[풀이과정]
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;
/*
N개의 노드로 이루어진 트리
M개의 두 노드 쌍을 입력받을 때 두 노드 사이의 거리를 출력
*/
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
static int N, M;
static LinkedList<Node>[] tree;
static class Node{
int number, distance;
public Node(int number, int distance){
this.number = number;
this.distance = distance;
}
}
public static void main(String[] args) throws IOException{
init();
for(int m = 0; m < M; m++){
st = new StringTokenizer(br.readLine());
int node1 = Integer.parseInt(st.nextToken());
int node2 = Integer.parseInt(st.nextToken());
getDistance(node1, node2);
}
/*
[출력]
M개의 줄에 차례대로 두 노드 사이의 거리 출력
*/
System.out.println(sb);
}
static void init() throws IOException{
/*
[입력]
1. 노드 개수 N, 거리를 알고 싶은 노드 쌍의 개수 M (2 <= N <= 1,000, 1 <= M <= 1,000)
2~N-1. 트리 상에 연결된 두 점과 거리 (10,000이하의 자연수)
3~M. 노드 쌍
*/
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
tree = new LinkedList[N+1];
for(int n = 1; n <= N; n++){
tree[n] = new LinkedList<Node>();
}
for(int n = 1; n < N; n++){
st = new StringTokenizer(br.readLine());
int node_1 = Integer.parseInt(st.nextToken());
int node_2 = Integer.parseInt(st.nextToken());
int distance = Integer.parseInt(st.nextToken());
tree[node_1].add(new Node(node_2, distance));
tree[node_2].add(new Node(node_1, distance));
}
}
static void getDistance(int start, int end){
Queue<Integer> queue = new LinkedList<>();
boolean[] visited = new boolean[N+1];
visited[start] = true;
queue.add(start);
int[] answer = new int[N+1];
while(!queue.isEmpty()){
int curNum = queue.poll();
LinkedList<Node> curList = tree[curNum];
for(int i = 0; i < curList.size(); i++){
Node node = curList.get(i);
int linkedNode = node.number;
int linkedDistance = node.distance;
if(!visited[linkedNode]){
answer[linkedNode] = answer[curNum] + linkedDistance;
//도착이면
if(linkedNode == end){
sb.append(answer[end] + "\n");
return;
}
queue.add(linkedNode);
visited[linkedNode] = true;
}
}
}
}
}
반응형
'백준 > DFS BFS' 카테고리의 다른 글
[백준] 2668 : 숫자고르기 (JAVA) (0) | 2024.11.22 |
---|---|
[백준] 16637 : 괄호 추가하기 (JAVA) (0) | 2024.11.15 |
[백준] 1068 : 트리 (JAVA) (0) | 2024.11.01 |
[백준] 7569 : 토마토 (JAVA) (1) | 2024.11.01 |
[백준] 17070 : 파이프 옮기기 1 (JAVA) (0) | 2024.10.07 |