반응형

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

 

14938번: 서강그라운드

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

www.acmicpc.net

 

모든 지역에 대해서 각 지역을 시작점으로 했을 때의 다익스트라를 수행해줍니다.

각 지역마다 구해진 다른 지역까지의 최단 거리를 이용해서 얻을 수 있는 아이템 갯수를 파악해준 뒤,

각 지역을 시작점으로 했을 때의 가장 많이 얻을 수 있었던 아이템 갯수를 구해줍니다.

 

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#define INF 2147483647
using namespace std;

int n, m, r, ans = 0, a, b, l, t[101];
vector<pair<int, int>> graph[101];

vector<int> dijkstra(int start) {
	priority_queue<pair<int, int>> pq;
	vector<int> dist(n + 1, INF);
	dist[start] = 0;
	pq.push({ 0, start });
	while (!pq.empty()) {
		int cost = -pq.top().first;
		int node = pq.top().second;
		pq.pop();
		if (dist[node] < cost) continue;
		for (int i = 0; i < graph[node].size(); i++) {
			int nextNode = graph[node][i].first;
			int nextCost = graph[node][i].second + cost;
			if (nextCost < dist[nextNode]) {
				dist[nextNode] = nextCost;
				pq.push({ -nextCost, nextNode });
			}
		}
	}
	return dist;
}

int main() {
	scanf("%d %d %d", &n, &m, &r);
	for (int i = 1; i <= n; i++)
		scanf("%d", &t[i]);
	
	for (int i = 0; i < r; i++) {
		scanf("%d %d %d", &a, &b, &l);
		graph[a].push_back({ b, l });
		graph[b].push_back({ a, l });
	}

	for (int i = 1; i <= n; i++) {
		int sum = 0;
		vector<int> d = dijkstra(i);
		for (int j = 1; j <= n; j++)
			if (d[j] <= m) sum += t[j];
		ans = max(ans, sum);
	}
	printf("%d", ans);
}
반응형

'Algorithm' 카테고리의 다른 글

백준 2109 : 순회강연  (0) 2021.11.17
백준 16947 : 서울 지하철 2호선  (0) 2021.11.17
백준 2922 : 즐거운 단어  (0) 2021.11.17
백준 1600 : 말이 되고픈 원숭이  (0) 2021.11.16
백준 20164 : 홀수 홀릭 호석  (0) 2021.11.16

+ Recent posts