#include <iostream>
int iSize[101] = {};
int graph[101][101] = {};
int main()
{
int n = 0;
int m = 0;
int r = 0;
std::cin >> n >> m >> r;
for (int i = 1; i <= n; ++i)
{
std::cin >> iSize[i];
}
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
graph[i][j] = 100000000;
if (i == j)
graph[i][j] = 0;
}
}
for (int i = 0; i < r; ++i)
{
int iStart = 0;
int iEnd = 0;
int iLong = 0;
std::cin >> iStart >> iEnd >> iLong;
graph[iStart][iEnd] = iLong;
graph[iEnd][iStart] = iLong;
}
for (int k = 1; k <= n - 1; ++k)
{
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
if (i == j)
continue;
if (graph[i][k] + graph[k][j] < graph[i][j])
{
graph[i][j] = graph[i][k] + graph[k][j];
}
}
}
}
int iMax = 0;
for (int i = 1; i <= n; ++i)
{
int iSum = 0;
for (int j = 1; j <= n; ++j)
{
if (graph[i][j] <= m)
{
iSum += iSize[j];
}
}
iMax = std::max(iMax, iSum);
}
std::cout << iMax;
return 0;
}
플로이드와샬 알고리즘을 이용해서 풀었습니다.
여러 개의 길을 한번에 구할 수 있기 때문에 이 알고리즘을 이용했습니다.
그 길을 다 구해서 수색범위 내에 있는 것들만 추가했습니다.
'오늘의 알고리즘' 카테고리의 다른 글
[C++] 백준 15657 N과 M(8) (0) | 2022.11.02 |
---|---|
[C++] 백준 15652 N과 M(4) (0) | 2022.11.01 |
[C++] 백준 14502 연구소 (0) | 2022.10.30 |
[C++] 백준 13172 Σ (0) | 2022.10.29 |
[C++] 백준 12851 숨바꼭질 2 (0) | 2022.10.28 |