-
[백준 14938] 서강그라운드백준/그래프 이론 2025. 1. 10. 15:46
맨처음에는 모든 정점을 BFS로 돌렸다
하지만 BFS로 돌릴 시 아래와 같은 경우에
3을 먼저 방문하고 4까지 방문해서
4가 visited 처리가 되면
2번에서 4번에 방문하지 못한다
따라서 1 -> 4는 사실 2인데
1 -> 4 가 201로 되서 4까지 못간다고 판단한다
따라서 각 N개의 노드에서 다른 노드로 가는 최적경로를 모두 구하고
각 N개의 노드에서 타 노드로 R만큼의 거리 이내에서 갈 수 있는지 판단하는 식으로 풀어야한다
따라서 플로이드 워셜로 풀면 된다
#include <iostream> #include <climits> #define SIZE 101 using namespace std; int dp[SIZE][SIZE]; int item[SIZE]; int N, M, R; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N >> M >> R; // 플로이드 워셜 전 초기화 for (int i = 1; i <= N;i++){ for (int k = 1; k <= N;k++){ dp[i][k] = INT_MAX; } } for (int i = 1; i <= N;i++) dp[i][i] = 0; for (int i = 1; i <= N;i++){ cin >> item[i]; } int start, end, cost; for (int i = 0; i < R; i++) { cin >> start >> end >> cost; if(cost < dp[start][end]) { dp[start][end] = cost; dp[end][start] = cost; } } for (int mid = 1; mid <= N; mid++){ for (int start = 1; start <= N; start++){ if(dp[start][mid] == INT_MAX) continue; for (int end = 1; end <= N; end++) { if (dp[mid][end] == INT_MAX) continue; dp[start][end] = min(dp[start][end], dp[start][mid] + dp[mid][end]); } } } int ans = INT_MIN; for (int i = 1; i <= N; i++) { int sum = 0; for (int k = 1; k <= N; k++) { // 수색범위보다 짧으면 if(dp[i][k] <= M){ sum += item[k]; } } if(sum > ans) ans = sum; } cout << ans; return 0; }
'백준 > 그래프 이론' 카테고리의 다른 글
[백준 1219] 오민식의 고민 (1) 2025.01.10 [백준 1738] 골목길 (0) 2025.01.09 [백준 1238] 파티 (0) 2024.02.17 [백준 14699] 관악산 등산 (2) 2024.01.28 [백준 1766] 문제집 (1) 2024.01.28