
📝 문제

📌 풀이
- 각 노드에 대해서 다익스트라 알고리즘을 이용하여 도착 노드까지의 최단 거리 배열을 구한다.
 
- 최단 거리 배열을 이용하여 수색 범위 내에 있는 곳의 아이템 개수를 모두 더한다.
 
- 최대 아이템 개수인지 비교하여 최대 아이템 개수만 저장한다.
 
- 최대 아이템 개수를 출력한다.
 
💻 코드
#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;
}