어흥

[백준 14938] 서강그라운드 (C++) 본문

알고리즘/백준

[백준 14938] 서강그라운드 (C++)

라이언납시오 2020. 12. 24. 14:03
728x90
반응형

문제 링크: www.acmicpc.net/problem/14938

 

14938번: 서강그라운드

예은이는 요즘 가장 인기가 있는 게임 서강그라운드를 즐기고 있다. 서강그라운드는 여러 지역중 하나의 지역에 낙하산을 타고 낙하하여, 그 지역에 떨어져 있는 아이템들을 이용해 서바이벌을

www.acmicpc.net

1. 주의할 점

- 다익스트라나 플로이드 와샬 알고리즘에 대해 알고 있어야 한다

 

2. 구현

- 각 Node마다 보유한 아이템의 수를 Item[] 배열에 담는다

- 플로이드 와샬 알고리즘을 사용하기 위해 Arr[][] 배열을 미리 초기화한다

- 간선이 주어진 경우, Arr[][]에 대입한다

- 플로이드 와샬 알고리즘을 수행한 후, 각 지점마다 수색범위 D를 넘지 않을 경우, Temp에 해당 지역이 보유한 아이템의 수를 모두 더한다.

- Temp와 Result를 비교하며 최대값을 Result에 저장한다

 

#define MAX 987654321
#include <iostream>
#include <algorithm>
using namespace std;
int node, d, road, a, b, val, result = 0;
int item[101];
int arr[101][101];

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cin >> node >> d >> road;
	for (int i = 1; i <= node; i++)
		cin >> item[i];
	for (int i = 1; i <= node; i++) 
		for (int j = 1; j <= node; j++) 
			if(i!=j)	arr[i][j] = MAX;
	for (int i = 0; i < road; i++) {
		cin >> a >> b >> val;
		arr[a][b] = val;
		arr[b][a] = val;
	}	
	for (int k = 1; k <= node; k++) 
		for (int i = 1; i <= node; i++) 
			for (int j = 1; j <= node; j++)
				if (arr[i][j] > arr[i][k] + arr[k][j])
					arr[i][j] = arr[i][k] + arr[k][j];

	for (int i = 1; i <= node; i++) {
		int temp = 0;
		for (int j = 1; j <= node; j++)
			if (arr[i][j] <= d)
				temp += item[j];
		result = max(result, temp);
	}
	cout << result;
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 20005] 보스몬스터 전리품 (C++)  (0) 2020.12.27
[백준 13908] 비밀번호 (C++)  (0) 2020.12.24
[백준 14923] 미로 탈출 (C++)  (0) 2020.12.23
[백준 10159] 저울 (C++)  (0) 2020.12.21
[백준 11964] Fruit Feast (C++)  (0) 2020.12.21
Comments