일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 브루트포스
- 그래프 탐색
- 최장길이바이토닉수열
- 2493 백준
- 재귀
- 결정문제
- Lis
- disjoint set
- 깊이 우선 탐색
- 1939백준
- parametric search
- 분할정복
- 구현
- 그래프 이론
- 백준 뒤집기 3
- 백준 1464
- boj 1464
- 그래프탐색
- bfs
- 결정 문제
- 서로소 집합
- 패스트캠퍼스
- 비트마스킹
- 최장증가수열
- 그래프이론
- 이분 탐색
- 뒤집기 3
- 이분탐색
- DP
- union find
Archives
- Today
- Total
알고리즘 문제풀이
[BOJ] 1240번 - 노드사이의 거리 본문
백준 1240번 - 노드사이의 거리
시간제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
2초 | 128MB | 1832 | 969 | 762 | 53.586% |
문제
N(2≤N≤1,000)개의 노드로 이루어진 트리가 주어지고 M(M≤1,000)개의 두 노드 쌍을 입력받을 때 두 노드 사이의 거리를 출력하라.
입력
첫째 줄에 노드의 개수 N이 입력되고 다음 N-1개의 줄에 트리 상에 연결된 두 점과 거리(10,000 이하의 정수)를 입력받는다. 그 다음 줄에는 거리를 알고 싶은 M개의 노드 쌍이 한 줄에 한 쌍씩 입력된다.
출력
M개의 줄에 차례대로 입력받은 두 노드 사이의 거리를 출력한다.
예제 입력1
4 2
2 1 2
4 3 2
1 4 3
1 2
3 2
예제 출력1
2
7
출처
알고리즘 분류
- 그래프 이론
- 그래프 탐색
- 트리
- 너비 우선 탐색
- 깊이 우선 탐색
접근 방법
노드의 개수가 최대 $10^3$ 이하이고 Query의 수가 $10^3$ 인것을 고려한다면, 충분히 $O(NM)$의 시간 복잡도를 가지는 Naive한 탐색으로 문제를 해결할 수 있다는 것을 알 수 있다.
또한, 주어지는 edge는 $N-1$ 이고 트리 형태의 입력만 주어진다는 정보를 병합하면, Tree상에 존재하는 모든 노드들은 Connected되어 있다는 것을 알 수 있다. 또한, 모든 노드들이 Connected되기 위하여 필요한 최소 Edge의 개수가 $N-1$ 이므로 불필요한 Edge가 추가되므로서 Cycle이 발생하는 경우는 없다고 볼 수 있다.
주어진 정보들을 이용하여, 기본적인 그래프 탐색 알고리즘으로 문제를 해결할 수 있다.
소스코드
#define FASTIO cin.tie(0)->sync_with_stdio(false), cout.tie(0)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int N, M;
ll ans;
bool visited[1001] = {false, };
vector<pair<int, int>> adj[1001];
void DFS(int u, const int target, ll acSum){
if(u == target){
ans = acSum;
return;
}
for(auto [next, cost] : adj[u]){
if(visited[next]) continue;
visited[next] = true;
DFS(next, target, acSum + cost);
}
}
int main(void){
FASTIO;
cin >> N >> M;
// cycle이 발생하지 않는다는 전제 조건
for(int i=0; i<N-1; i++){
int u, v, cost;
cin >> u >> v >> cost;
adj[u].push_back({v, cost});
adj[v].push_back({u, cost});
}
// DFS로 풀만함
while(M--){
ans = 0;
memset(visited, false, sizeof(visited));
int u, v;
cin >> u >> v;
visited[u] = true;
DFS(u, v, 0);
cout << ans << '\n';
}
return 0;
}
'자료구조 + 알고리즘 > [BOJ]' 카테고리의 다른 글
[BOJ] 2933번 - 미네랄 (0) | 2022.01.16 |
---|---|
[BOJ] 16472번 - 고냥이 (0) | 2021.12.31 |
[BOJ] 1715번 - 카드 정렬하기 (0) | 2021.12.30 |
[BOJ] 15992번 - 1,2,3 더하기 7 (0) | 2021.12.30 |
[BOJ] 10749번 - Superbull (0) | 2021.12.30 |
Comments