www.acmicpc.net/problem/14938

 

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

+ Recent posts