문제
https://www.acmicpc.net/problem/1240
1240번: 노드사이의 거리
첫째 줄에 노드의 개수 $N$과 거리를 알고 싶은 노드 쌍의 개수 $M$이 입력되고 다음 $N-1$개의 줄에 트리 상에 연결된 두 점과 거리를 입력받는다. 그 다음 줄에는 거리를 알고 싶은 $M$개의 노드 쌍
www.acmicpc.net
문제 요약
N개의 노드로 이루어진 트리가 주어졌을 때, M개의 두 노드 쌍을 입력 받고 두 노드 사이의 거리를 출력한다.
코드
#include <iostream>
#include <vector>
#include <tuple>
#include <cstring>
#define MAX_N 1000
using namespace std;
int n, m;
int start_node, end_node;
bool visited[MAX_N + 1];
vector<tuple<int, int>> edges[MAX_N + 1];
// DFS 진행
void dfs(int x, int dist) {
visited[x] = true;
// 찾아야하는 노드에 접근했다면, 거리 출력
if (x == end_node) {
cout << dist << "\n";
return;
}
for (int i = 0; i < edges[x].size(); i++) {
int y, d;
tie(y, d) = edges[x][i];
if (visited[y]) continue;
dfs(y, dist + d);
}
}
int main() {
cin >> n >> m;
// 트리 입력
for (int i = 0; i < n - 1; i++) {
int a, b, w;
cin >> a >> b >> w;
edges[a].push_back({ b, w });
edges[b].push_back({ a, w });
}
// 두 노드 사이의 거리 찾기
for (int i = 0; i < m; i++) {
cin >> start_node >> end_node;
dfs(start_node, 0);
memset(visited, false, sizeof(visited));
}
return 0;
}
코드 설명
트리 정보를 입력 받고, 인접리스트 형태로 저장한다.
시작 노드에서부터 도착 노드를 찾을 때까지 각 노드까지의 거리를 계산하며 DFS를 진행한다.
도착 노드를 찾았다면, 현재까지의 거리를 출력하고 탐색을 종료한다.
'Algorithm Problems > 그래프' 카테고리의 다른 글
[백준/C++] 16562번: 친구비 (0) | 2024.04.16 |
---|---|
[백준/C++] 16953번: A -> B (0) | 2024.03.09 |
[백준/C++] 1068번: 트리 (0) | 2024.02.27 |
[백준/C++] 1647번: 도시 분할 계획 (3) | 2024.02.18 |
[백준/C++] 1504번: 특정한 최단 경로 (2) | 2024.02.09 |