https://www.acmicpc.net/problem/14938
[난이도] Gold4
[유형] 플로이드 와샬
[풀이]
플로이드 와샬로 모든 지점간 거리를 구한 후
각 점에서 M거리 이하인 지점의 아이템 개수를 모두 더한 값의 최솟값이 정답이다.
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold4/14938.cpp
#include <cstdio>
#include <algorithm>
using namespace std;
int N,M,R,item[101],dist[101][101],inf=9e8,ans;
int main(){
scanf("%d%d%d",&N,&M,&R);
for(int i=1;i<=N;i++) scanf("%d",&item[i]);
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(i!=j) dist[i][j] = inf;
}
}
while(R--){
int a,b,l;
scanf("%d%d%d",&a,&b,&l);
dist[a][b] = min(dist[a][b],l);
dist[b][a] = min(dist[b][a],l);
}
for(int k=1;k<=N;k++)
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++) dist[i][j] = min(dist[i][j],dist[i][k]+dist[k][j]);
for(int i=1;i<=N;i++){
int sum=0;
for(int j=1;j<=N;j++){
if(dist[i][j]<=M) sum+=item[j];
}
ans = max(ans,sum);
}
printf("%d",ans);
}
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold4] 2655 : 가장높은탑쌓기 (C++) (0) | 2021.01.13 |
---|---|
[BOJ/백준][Gold4] 14864 : 줄서기 (C++) (0) | 2021.01.13 |
[BOJ/백준][Gold4] 11967 : 불켜기 (C++) (0) | 2021.01.13 |
[BOJ/백준][Gold4] 1344 : 축구 (C++) (0) | 2021.01.13 |
[BOJ/백준][Gold4] 7573 : 고기잡이 (C++) (0) | 2021.01.06 |