PS
BOJ 14938 : 서강그라운드
lickelon
2024. 5. 9. 22:30
- 문제 링크 : boj.kr/14938
- 난이도 : G4
- 태그 : 플로이드 워셜
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 987654321
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n, m, r;
cin >> n >> m >> r;
vector<int> items(n);
for(auto &u : items) cin >> u;
vector<vector<int>> arr(n, vector<int>(n, INF));
for(int i = 0; i < r; i++) {
int a, b, c;
cin >> a >> b >> c;
arr[a-1][b-1] = c;
arr[b-1][a-1] = c;
}
for(int i = 0; i < n; i++) {
arr[i][i] = 0;
}
for(int k = 0; k < n; k++) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(arr[i][j] > arr[i][k] + arr[k][j]) {
arr[i][j] = arr[i][k] + arr[k][j];
}
}
}
}
int ans = 0;
for(int i = 0; i < n; i++) {
int sum = 0;
for(int j = 0; j < n; j++) {
if(arr[i][j] <= m) sum += items[j];
}
ans = max(ans, sum);
}
cout << ans;
return 0;
}
풀이
각 노드 사이의 모든 거리를 플로이드 워셜로 구한다.
이후 어떤 한 노드에서 다른 노드들까지의 거리가 조건 m을 만족하는 노드들의 아이템의 수의 합을 구하고, 최댓값을 구해주면 된다.
728x90