hwooo
BOJ (C/C++) 14938번: 서강그라운드 본문
https://www.acmicpc.net/problem/14938
14938번: 서강그라운드
예은이는 요즘 가장 인기가 있는 게임 서강그라운드를 즐기고 있다. 서강그라운드는 여러 지역중 하나의 지역에 낙하산을 타고 낙하하여, 그 지역에 떨어져 있는 아이템들을 이용해 서바이벌을
www.acmicpc.net


풀이
출발 지점에서 모든 나머지 노드까지의 거리를 구한다. -> 다익스트라 알고리즘 사용
구한 최소 거리의 값이 수색 범위 내에 있는 노드의 아이템 수를 구한다.
이 때, 출발지에 따라 얻을 수 있는 아이템의 최대 개수는 달라지므로 모든 노드의 경우를 따져봐야 한다.
코드
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
int item[101], dis[101];
bool visited[101];
vector <pair<int, int>> V[101];
int Search(int start, int len, int N) {
priority_queue <pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Q;
// 출발지점 지정
dis[start] = 0;
Q.push({ dis[start], start });
visited[start] = true;
// 출발지점에서 모든 노드까지의 최소 거리 구하기, Dijkstra
while (!Q.empty()) {
int now = Q.top().second, dis_now = Q.top().first;
Q.pop();
visited[now] = true;
for (int i = 0; i < V[now].size(); i++) {
int next = V[now][i].second, dis_next = V[now][i].first;
if (visited[next]) continue;
if (dis[next] > dis_now + dis_next) {
dis[next] = dis_now + dis_next;
Q.push({ dis[next], next });
}
}
}
// 수색 범위 내에 있는 아이템의 총 개수 구하기
int sum = 0;
for (int i = 1; i <= N; i++) {
if (dis[i] <= len) sum += item[i];
}
return sum;
}
int main() {
int n, m, r;
int a, b, l;
int max = 0;
// input
scanf("%d %d %d", &n, &m, &r);
for (int i = 1; i <= n; i++) scanf("%d", &item[i]);
for (int i = 0; i < r; i++) {
scanf("%d %d %d", &a, &b, &l);
// 양방향 그래프
V[a].push_back({ l,b });
V[b].push_back({ l,a });
}
// 모든 출발지에서 얻을 수 있는 아이템 개수 구하기
for (int i = 1; i <= n; i++) {
// init
fill(dis, dis + n + 1, 1000000);
fill(visited, visited + n + 1, false);
int sum = Search(i, m, n);
if (max < sum) max = sum;
}
printf("%d", max);
return 0;
}
'Study > Algorithm' 카테고리의 다른 글
| BOJ (C/C++) 11779번: 최소비용 구하기 2 (0) | 2023.04.28 |
|---|---|
| BOJ (C/C++) 10282번: 해킹 (0) | 2023.04.28 |
| BOJ (C/C++) 4485번: 녹색 옷 입은 애가 젤다지? (0) | 2023.04.27 |
| BOJ (C/C++) 2903번: 중앙 이동 알고리즘 (0) | 2023.04.27 |
| BOJ (C/C++) 11005번: 진법 변환 2 (0) | 2023.04.27 |