일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Java
- hash
- 백준 2473번 세 용액 - java
- 백준 1806번 부분합 java
- replace()
- 백준 3190번
- 최소 힙 1927
- 백준 1541
- map
- dp
- 프로그래머스 java
- kotlin
- 18111번 마인크래프트 - java 구현
- 백준 14938번 서강그라운드
- 백준 1647번 도시 분할 계획 - java
- mysql hy000 에러
- HashMap
- 백준 2467번 용액 자바 - 이분탐색
- toUpperCase
- ac 5430번
- StringTokenizer
- 코틀린기초
- append
- Stack
- StringBuilder
- 백준 1197번 최소 스패닝 트리 - java
- HashSet
- 백준 1043번 거짓말 - java 분리 집합
- 프로그래머스 자바
- 프로그래머스
Archives
- Today
- Total
말하는 컴공감자의 텃밭
백준 14938번 서강그라운드 - Java 다익스트라 본문
728x90
모든지점에서 양방향 다리를 통해 정해진 비용 안으로 아이템을 많이 얻는 길을 탐색해야하는 문제이다.
플로이드 워샬과 다익스트라를 생각할 수 있는데 모든 정점이기 때문에 플로이드 워샬을 선택하는게 맞았다.
다만.. 다익스트라가 땡기잖아 >< 오랜만이라
접근법은 먼저 모든 정점을 탐색해야 했기에 포문에 넣어 로직을 돌려줬다.
로직은 우선순위큐를 활용해서 시간이 짧은 순으로 정렬하여 처리를 했다.
해당 거리를 방문하고 비용이 m 보다 크지 않다면 큐에 넣어 반복해 주었다.
기존에 visit Boolean을 안써서 틀렸었다..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | import java.io.*; import java.util.*; public class Main { // 서강그라운드 public static int[] costs, node; public static int[][] map; public static int n, m, r; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); StringTokenizer st = new StringTokenizer(br.readLine()); n = Integer.parseInt(st.nextToken()); m = Integer.parseInt(st.nextToken()); // 범위 r = Integer.parseInt(st.nextToken()); node = new int[n + 1]; map = new int[n + 1][n + 1]; st = new StringTokenizer(br.readLine()); for (int i = 1; i <= n; i++) { node[i] = Integer.parseInt(st.nextToken()); } for (int i = 1; i <= r; i++) { st = new StringTokenizer(br.readLine()); int start = Integer.parseInt(st.nextToken()); int end = Integer.parseInt(st.nextToken()); int value = Integer.parseInt(st.nextToken()); map[start][end] = value; map[end][start] = value; } int maxSum = 0; for (int i = 1; i <= n; i++) { maxSum = Math.max(maxSum, search(i)); // 각 시작점에서 탐색 } sb.append(maxSum); System.out.println(sb); } public static int search(int start) { costs = new int[n + 1]; boolean[] visited = new boolean[n + 1]; Arrays.fill(costs, Integer.MAX_VALUE); PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1])); pq.add(new int[]{start, 0}); costs[start] = 0; int sum = 0; while (!pq.isEmpty()) { int[] now = pq.poll(); int curNode = now[0]; int curCost = now[1]; if (visited[curNode]) continue; visited[curNode] = true; if (curCost > m) { continue; } sum += node[curNode]; for (int i = 1; i <= n; i++) { if (map[curNode][i] != 0 && !visited[i]) { int nextCost = curCost + map[curNode][i]; if (nextCost < costs[i]) { costs[i] = nextCost; pq.add(new int[]{i, nextCost}); } } } } return sum; } } | cs |
728x90
'알고리즘 > Backjoon - Java' 카테고리의 다른 글
백준 1043번 거짓말 - Java 분리 집합 (0) | 2024.08.30 |
---|---|
백준 2473번 세 용액 - Java 이분탐색 (0) | 2024.08.29 |
백준 1197번 최소 스패닝 트리 - Java (0) | 2024.08.28 |
백준 18111번 마인크래프트 - Java 구현 (0) | 2024.08.27 |
백준 1647번 도시 분할 계획 - Java 최소 스패닝 트리 (0) | 2024.08.26 |
Comments