Tags
- Dynamic Programming
- ์ ์๋ก
- stack
- DP
- Study
- ์ํ
- BFS
- Brute Force Algorithm
- Python
- CodingTest
- ๊ทธ๋ํ ์ด๋ก
- ๊ทธ๋ํ ํ์
- BOJ
- queue
- ์ ๋ ฌ
- ๋๋น ์ฐ์ ํ์
- LV2
- PGM
- greedy
- ๋ฐฑํธ๋ํน
- ์๋ฃ๊ตฌ์กฐ
- SpringBoot
- Java
- ์๋ฎฌ๋ ์ด์
- ๊ต์ฌ
- sort
- ๊น์ด ์ฐ์ ํ์
- ๊ตฌํ
- ๋ฌธ์์ด
- dfs
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_1238 : ํํฐ ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- N๋ช
์ ์ฌ๋๊ณผ M๊ฐ์ ๋๋ก๊ฐ ์๋ค.
- X๋ฒ ์ฌ๋์ ์ง์ ๋ชจ๋๊ฐ ์ต๋จ๊ฑฐ๋ฆฌ๋ก ๋ชจ์ด๊ณ ์ง์ ๊ฐ ๋, ์์์๊ฐ์ ์ต๋ ๊ฐ์ ์ถ๋ ฅํ๋ค.
- ๊ฐ ์ง ์ฌ์ด์ ๋๋ก๋ ๋จ๋ฐฉํฅ ์ฐ๊ฒฐ์ด๋ค.
- ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ณ ๊ทธ ์ค ์ต๋ ๊ฐ์ ์ฐพ์์ผ ํ๋ค.
- ๊ฐ์ ์ง์์ ํํฐ๋ก ๊ฐ ๋๋ ๊ฐ๊ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผ ํ๋ฏ๋ก, ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ N-1๋ฒ ๋ฐ๋ณตํ๋ค.
- ํํฐ์์ ์ง์ผ๋ก ๋์๊ฐ ๋๋ ์์ ๋ ธ๋์์ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๋ก์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผ ํ๋ฏ๋ก, ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค. (๋๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ N-1๋ฒ ๋ฐ๋ณตํ๋ค)
๐ธ ์ฝ๋ ๐ธ
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
private static class Edge implements Comparable<Edge> {
int node, weight;
public Edge(int node, int weight) {
this.node = node;
this.weight = weight;
}
@Override
public int compareTo(Edge o) {
return this.weight - o.weight;
}
}
private static int N, M, X;
private static ArrayList<Edge>[] adjList;
private static boolean[] visited;
public static void main(String[] args) throws IOException {
// Input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // ํ์(์ง) ์
M = Integer.parseInt(st.nextToken()); // ๋๋ก ์
X = Integer.parseInt(st.nextToken()); // ํํฐ ์ง ๋ฒํธ
adjList = new ArrayList[N + 1]; // ์ธ์ ๋ฆฌ์คํธ : ๋ค์ต์คํธ๋ผ์ฉ
for (int i = 1; i <= N; i++) {
adjList[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
int time = Integer.parseInt(st.nextToken());
Edge temp = new Edge(end, time);
adjList[start].add(temp);
}
// Prim
int[] goToHome = new int[N + 1];
Arrays.fill(goToHome, Integer.MAX_VALUE);
PriorityQueue<Edge> pq = new PriorityQueue<>(); // ์ฐ์ ์์ ํ : ํ๋ฆผ์ฉ
visited = new boolean[N + 1];
pq.add(new Edge(X, 0));
while (!pq.isEmpty()) {
Edge now = pq.poll();
if (visited[now.node]) continue; //์ด๋ฏธ ๋ฐฉ๋ฌธ ํ ๋
ธ๋๋ฉด ๋ค์ ๋ฝ๊ธฐ
visited[now.node] = true;
goToHome[now.node] = now.weight;
for (Edge e : adjList[now.node]) {
if (!visited[e.node]) {
pq.add(new Edge(e.node, e.weight + goToHome[now.node]));
}
}
}
// System.out.println(Arrays.toString(goToHome));
// Dijkstra
int[] goToParty = new int[N + 1];
for (int i = 1; i <= N; i++) {
if (i == X)
goToParty[i] = 0;
else
goToParty[i] = dijkstra(i, X);
}
// System.out.println(Arrays.toString(goToParty));
// Output
int max = 0;
for (int i = 1; i <= N; i++) {
max = Math.max(max, goToHome[i] + goToParty[i]);
}
bw.write(Integer.toString(max));
bw.flush();
}
private static int dijkstra(int start, int end) {
int[] dist = new int[N + 1];
Arrays.fill(dist, Integer.MAX_VALUE);
PriorityQueue<Edge> pq = new PriorityQueue<>();
dist[start] = 0;
pq.add(new Edge(start, 0));
while (!pq.isEmpty()) {
Edge now = pq.poll();
for (Edge e : adjList[now.node]) {
int nw = now.weight + e.weight;
if (dist[e.node] > nw) {
dist[e.node] = nw;
pq.add(new Edge(e.node, nw));
}
}
}
return dist[end];
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- ๋ ธ๋์ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ธ์ ๋ฆฌ์คํธ adjList์ ์ ์ ํ๋ค.
- Prim ์๊ณ ๋ฆฌ์ฆ์ผ๋ก X๋ฒ ์ง์์ ๊ฐ์์ ์ง์ผ๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํด goToHome ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
- Dijkstra ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ฐ์์ ์ง์์ X๋ฒ ์ง์ ์ค๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํด goToParty ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
- n-1๋ฒ dijkstra ๋ฉ์๋๋ฅผ ํธ์ถํด ๊ณ์ฐ์ ๋ฐ๋ณตํ๋ค.
๐ธ end ๐ธ
- ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํด์ผ ํ๋ค๋ ๊ฒ๋ ์ผ์ฐ ํ์
ํ๊ณ , ๋ค์ต์คํธ๋ผ์ ํ๋ฆผ ์ ํ๋ ๋ฐ๋ก ์๊ฐ๋ฌ์ง๋ง ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ์ ์๊ฐ์ด ๋ง์ด ๋ค์๋ค.
- ์์ง ์๊ณ ๋ฆฌ์ฆ ํ์ต๊ณผ ์ฐ์ต์ด ๋ ํ์ํ ๊ฒ ๊ฐ๋ค.
728x90
'CodingTest > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ_1753 : ์ต๋จ๊ฒฝ๋ก (0) | 2023.07.02 |
---|---|
BOJ_1504 : ํน์ ํ ์ต๋จ ๊ฒฝ๋ก (0) | 2023.06.28 |
BOJ_1167 : ํธ๋ฆฌ์ ์ง๋ฆ (0) | 2023.06.25 |
BOJ_15663 : N๊ณผ M (9) (0) | 2023.06.11 |
BOJ_1043 : ๊ฑฐ์ง๋ง (0) | 2023.06.09 |