문제풀이/백준oj
[백준OJ] 1240번 노드사이의 거리
Hyeon-Uk
2021. 7. 20. 10:17
반응형
https://www.acmicpc.net/problem/1240
1240번: 노드사이의 거리
N(2≤N≤1,000)개의 노드로 이루어진 트리가 주어지고 M(M≤1,000)개의 두 노드 쌍을 입력받을 때 두 노드 사이의 거리를 출력하라.
www.acmicpc.net
-풀이-
N과 M의 값이 크지않기 때문에, 트리를 만든 뒤, 두 노드를 입력받아 BFS알고리즘을 실행하여 두 점사이의 최소거리를 구해준다.
-시간복잡도-
BFS의 시간복잡도는 O(V+E)가 된다. V=N이고 E=N-1이기 때문에 결국 시간복잡도는 O(N)이 된다.
이 BFS를 M번 실행하므로 최종 시간복잡도는 O(NM)이 된다.
-코드-
#include<iostream>
#include <algorithm>
#include<vector>
#include<queue>
#include<utility>
#define MAX 987654321
using namespace std;
int N, M;
vector<pair<int, long long>> v[1001];
long long dist[1001];
void bfs(int a,int b) {
priority_queue<pair<long long,int>> pq;//dist,to 페어로 우선순위 큐 저장
pq.push(make_pair(0, a));
for (int i = 1; i <= N; i++) dist[i] = MAX;
dist[a] = 0;
while (!pq.empty()) {
int now = pq.top().second;
long long dpdist = -1*pq.top().first;
pq.pop();
for (int i = 0; i < v[now].size(); i++) {
int next = v[now][i].first;
int nowdist = v[now][i].second;
if (nowdist + dpdist < dist[next]) {
dist[next] = nowdist + dpdist;
pq.push(make_pair(-1*dist[next],next));
}
}
}
}
int main() {
cin >> N >> M;
for (int i = 0; i < N - 1; i++) {
int x, y, w;
cin >> x >> y >> w;
v[x].push_back(make_pair(y, w));
v[y].push_back(make_pair(x, w));
}
for (int i = 0; i < M; i++) {
int a, b;
cin >> a >> b;
bfs(a, b);
cout << dist[b]<<"\n";
}
return 0;
}
반응형