문제/백준

c++ 백준_14938_"서강그라운드"

나 진짜 못차마 2023. 6. 9. 22:22
728x90

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

 

14938번: 서강그라운드

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

www.acmicpc.net

 

floyd 알고리즘을 사용해

각 지점에서 각 지점까지의 최단거리를 다 구해서

갈 수 있는 방향에 item 개수를 더하였다.

#include <iostream>
#include <vector>
using namespace std;

#define INF 1000000000

int path[101][101];
int item[101];
int n, m, r;

void floyd() {

	for (int k = 1; k <= n; k++) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				if (path[i][k] + path[k][j] < path[i][j])
					path[i][j] = path[i][k] + path[k][j];
			}
		}
	}
}


int main(void) {

	
	cin >> n >> m >> r;

	for (int i = 1; i <= n; i++) {
		cin >> item[i];
	}

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= i; j++) {
			path[i][j] = INF;
			path[j][i] = INF;
		}
		path[i][i] = 0;
	}
	

	int a, b, l;
	for (int i = 0; i < r; i++) {
		cin >> a >> b >> l;
		path[a][b] = l;
		path[b][a] = l;
	}

	floyd();

	int max_item = 0;
	for (int i = 1; i <= n; i++) {
		int sum = 0;
		for (int j = 1; j <= n; j++) {
			if (path[i][j] <= m)
				sum += item[j];
		}
		max_item = max(max_item, sum);
	}
	cout << max_item;
}

728x90