14938번: 서강그라운드
예은이는 요즘 가장 인기가 있는 게임 서강그라운드를 즐기고 있다. 서강그라운드는 여러 지역중 하나의 지역에 낙하산을 타고 낙하하여, 그 지역에 떨어져 있는 아이템들을 이용해 서바이벌을
www.acmicpc.net
- 기본적인 다익스트라 문제이다.
- 모든 시작점에 대해서 각각 최단경로들을 구한 후, 수색 범위에 들어오는 노드들을 다 받아서 최댓값을 구하면 된다.
#include <iostream>
#include <vector>
#include <queue>
#define INF 1000000000
using namespace std;
int n, m, r;
int a, b, l;
int items[100];
vector<pair<int, int>> graph[100];
int dijkstra(int start) // 특정 시작점에서 얻을 수 있는 아이템의 개수 반환
{
vector<int> length(n, INF);
priority_queue<pair<int, int>> pq;
length[start] = 0;
pq.push({0, start}); // 시작점에서 다익스트라 출발
while(pq.size())
{
int curDist = -pq.top().first;
int curNode = pq.top().second;
pq.pop();
if(length[curNode] < curDist) continue; // 이미 최소거리로 갱신된 노드라면 스킵
for(int i = 0 ; i < graph[curNode].size() ; i++) // 연결된 노드들에 대해서
{
int nextDist = curDist + graph[curNode][i].second;
int nextNode = graph[curNode][i].first;
if(nextDist < length[nextNode]) // 거리 갱신되는 노드가 있으면
{
length[nextNode] = nextDist; // 업데이트 한 뒤
pq.push({-nextDist, nextNode}); // 큐에 넣어줌
}
}
}
int ret = 0;
for(int i = 0 ; i < n ; i++) // 모든 위치에 대해서
{
if(length[i] <= m) ret += items[i]; // 얻을 수 있는 아이템인지 확인 후 처리
}
return ret;
}
int main(void)
{
cin >> n >> m >> r;
for(int i = 0 ; i < n ; i++)
{
cin >> items[i];
}
for(int i = 0 ; i < r ; i++)
{
cin >> a >> b >> l;
graph[a-1].push_back({b-1, l});
graph[b-1].push_back({a-1, l});
}
int answer = 0;
for(int i = 0 ; i < n ; i++) // 모든 시작점에 대해서 검사하며
{
int temp = dijkstra(i); // 가장 많이 아이템을 얻는 위치 검사
if(temp > answer) answer = temp;
}
cout << answer << endl;
}
'PS > BOJ' 카테고리의 다른 글
[백준] 1707 : 이분 그래프 (0) | 2021.04.13 |
---|---|
[백준] 2583 : 영역 구하기 (0) | 2021.04.12 |
[백준] 1941 : 소문난 칠공주 (0) | 2021.04.07 |
[백준] 2638 : 치즈 (0) | 2021.03.28 |
[백준] 2206 : 벽 부수고 이동하기 (0) | 2021.03.26 |