1. 문제이해
최단거리를 구해서 조건에 맞게 값을 출력하는 문제
모든 정점에 대해 알아봐야하기 때문에 다익스트라를 n번 하거나 플로이드와샬을 하면 됐다.
n^3을 해도 1000000밖에 되지 않아 1초에 들어오기 때문에 플로이드와샬로 문제를 풀었다.
연결되어 있는 것 중
수색범위가 m 이하
얻을 수 있는 아이템이 최대인 것을 출력 !
2. 풀이
#include <iostream>
#include <vector>
using namespace std;
#define INF 100000000
#define MAX 101
int n, m, r, a, b, c;
int dist[MAX][MAX];
vector<int> items;
int maxRes = 0;
int main() {
cin >> n >> m >> r;
items.resize(n + 1);
for (int i = 1; i <= n; i++) {
cin >> items[i];
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) {
dist[i][j] = 0;
dist[j][i] = 0;
} else {
dist[i][j] = INF;
dist[j][i] = INF;
}
}
}
for (int i = 0; i < r; i++) {
cin >> a >> b >> c;
if (dist[a][b] > c) {
dist[a][b] = c;
dist[b][a] = c;
}
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (dist[i][k] == INF || dist[k][j] == INF) {
continue;
}
if (dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
dist[j][i] = dist[i][k] + dist[k][j];
}
}
}
}
for (int i = 1; i <= n; i++) {
int sum = 0;
for (int j = 1; j <= n; j++) {
if (dist[i][j] <= m) {
sum += items[j];
}
}
if (sum > maxRes) {
maxRes = sum;
}
}
cout << maxRes;
return 0;
}
'⚖️Algorithm' 카테고리의 다른 글
[백준 1202] 보석 도둑 (0) | 2022.08.22 |
---|---|
[백준 17144] 미세먼지 안녕! (0) | 2022.08.16 |
[백준 2406] 안정적인 네트워크 (0) | 2022.08.03 |
[백준 14676] 영우는 사기꾼? (0) | 2022.07.26 |
[백준 3020] 개똥벌레 (0) | 2022.07.26 |