본문 바로가기

백준

백준14938 - 서강그라운드

https://www.acmicpc.net/problem/14938

 

14938번: 서강그라운드

예은이는 요즘 가장 인기가 있는 게임 서강그라운드를 즐기고 있다. 서강그라운드는 여러 지역중 하나의 지역에 낙하산을 타고 낙하하여, 그 지역에 떨어져 있는 아이템들을 이용해 서바이벌을 하는 게임이다. 서강그라운드에서 1등을 하면 보상으로 치킨을 주는데, 예은이는 단 한번도 치킨을 먹을 수가 없었다. 자신이 치킨을 못 먹는 이유는 실력 때문이 아니라 아이템 운이 없어서라고 생각한 예은이는 낙하산에서 떨어질 때 각 지역에 아이템 들이 몇 개 있는지 알려주는

www.acmicpc.net

플로이드 와샬을 이용하여 풀었다. n개의 마을이 주어지고 서로 도달할 수 있는 비용이 주어져 있는 상태이기 때문에 플로이드 와샬을 수행하여 서로 도달하기 위하여 필요한 비용을 구하였다. 비용을 구한 후 각 마을을 기점으로 최대로 쓸 수 있는 비용보다 작은 경로를 찾아서 아이템의 수를 더하여 가장 많은 아이템을 먹을 수 있는 마을을 찾아서 출력하면 된다.

 

#include <iostream>
#include <vector>
#include <algorithm>
#define MAX 101
using namespace std;

int n, m, r; //n개 마을, m개의 최대 비용, r개의 길의 갯수
int a, b, l; //a에서 b까지 비용 l이 든다.
int d[MAX][MAX] = {0,}; //플로이드 와샬 결과
int item[MAX] = {0, }; //각 마을의 아이템 갯수
int ans = -1; //답

//플로이드 와샬 수행
void floydWashall() {
    for(int k = 1; k <= n; k++) {
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                if(d[i][j] > d[i][k] + d[k][j]) {
                    d[i][j] = d[i][k] + d[k][j];
                }
            }
        }
    }
}

//처음에 인덱스가 같을 때를 제외하고 모든 공간을 무한대로 처리(987654321)
void setting() {
    for(int i = 1; i < MAX; i++) {
        for(int j = 1; j < MAX; j++) {
            if(i != j) {
                d[i][j] = 987654321;
            }
        }
    }
}

int main() {
    setting();
    
    cin >> n >> m >> r;
    for(int i = 1 ; i <= n; i++) { //마을의 아이템을 초기화
        cin >> item[i];
    }
    
    //양 방향으로 마을이 연결
    for(int i = 0; i < r; i++) {
        cin >> a >> b >> l;
        d[a][b] = l;
        d[b][a] = l;
    }
    
    floydWashall();
    
    for(int i = 1; i <= n; i++) {
        int cnt = item[i]; //시작하는 마을을 비용으로 넣는다.
        for(int j = 1; j <= n; j++) {
            if(i == j) { //같은 마을이면
                continue; //무시
            }
            if(d[i][j] <= m) { //다른 마을이고 비용이 m이하이면
               cnt = cnt + item[j]; //현재 마을에서 더한다.
            }
        }
        ans = max(ans, cnt); //더 많이 먹은 결과를 얻는다.
    }
    
    cout << ans;
    
    return 0;
}

'백준' 카테고리의 다른 글

백준1325 - 효율적인 해킹  (0) 2020.04.08
백준1780 - 종이의 갯수  (0) 2020.04.07
백준15723 - n단 논법  (0) 2020.04.03
백준16401 - 과자 나눠주기  (0) 2020.04.02
백준1166 - 선물  (0) 2020.03.31