📝 문제
📌 풀이
- 각 노드에 대해서 다익스트라 알고리즘을 이용하여 도착 노드까지의 최단 거리 배열을 구한다.
- 최단 거리 배열을 이용하여 수색 범위 내에 있는 곳의 아이템 개수를 모두 더한다.
- 최대 아이템 개수인지 비교하여 최대 아이템 개수만 저장한다.
- 최대 아이템 개수를 출력한다.
💻 코드
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector<pair<int, int>> a[101];
int INF = 987654321;
int* dijkstra(int d[], int start) {
d[start] = 0;
priority_queue<pair<int, int>> pq;
pq.push(make_pair(start, 0));
while (!pq.empty()) {
int current = pq.top().first;
int distance = pq.top().second;
pq.pop();
if (d[current] < distance) continue;
for (int i = 0; i < a[current].size(); i++) {
int next = a[current][i].first;
int nextDistance = a[current][i].second + distance;
if (nextDistance < d[next]) {
d[next] = nextDistance;
pq.push(make_pair(next, nextDistance));
}
}
}
return d;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m, r;
cin >> n >> m >> r;
int item[101] = { 0 };
for (int i = 1; i <= n; i++) {
cin >> item[i];
}
for (int i = 0; i < r; i++) {
int start;
int end;
int distance;
cin >> start >> end >> distance;
a[start].push_back(make_pair(end, distance));
a[end].push_back(make_pair(start, distance));
}
int max_item = 0;
for (int i = 1; i <= n; i++) {
int d[101] = { 0 };
for (int i = 1; i <= n; i++) {
d[i] = INF;
}
int* tmp_d = dijkstra(d, i);
int tmp_item = 0;
for (int j = 1; j <= n; j++) {
if (tmp_d[j] <= m) {
tmp_item += item[j];
}
}
if (max_item < tmp_item) {
max_item = tmp_item;
}
}
cout << max_item << '\n';
return 0;
}