[ 문제 ]
[ 접근방법 ]
시작 지역을 기준으로 거리가 m 이하인 지역에 존재하는 아이템 수의 합을 구해야 한다.
모든 지역이 시작 지점이 될 수 있기에 플로이드-워셜 알고리즘을 활용하여 모든 최단 거리를 구하였다.
n ≤ 100 이므로 플로이드-워셜 알고리즘을 사용하더라도 시간은 충분하다. O(N^3)
[ 소스코드 ]
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, r, t[105], d[105][105], INF = 10000;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> r;
for(int i = 1; i <= n; i++){
cin >> t[i];
for(int j = 1; j <= n; j++){
if(i != j){
d[i][j] = INF;
}
}
}
for(int i = 0; i < r; i++){
int a, b, c;
cin >> a >> b >> c;
d[a][b] = c;
d[b][a] = c;
}
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
int ans = 0;
for(int i = 1; i <= n; i++){
int sum = 0;
for(int j = 1; j <= n; j++){
if(d[i][j] <= m){
sum += t[j];
}
}
ans = max(ans, sum);
}
cout << ans;
return 0;
}
'PS' 카테고리의 다른 글
[ 백준 / C++ ] 1865 : 웜홀 (0) | 2025.04.21 |
---|---|
[ 백준 / C++ ] 2638 : 치즈 (0) | 2025.04.17 |
[ 백준 / C++ ] 2240 : 자두나무 (0) | 2025.04.09 |
[ 백준 / C++ ] 17144 : 미세먼지 안녕! (0) | 2025.04.07 |
[ 백준 / C++ ] 2251 : 물통 (0) | 2025.04.01 |