Tags
- ์๋ฎฌ๋ ์ด์
- PGM
- ์ํ
- BFS
- ์ ์๋ก
- CodingTest
- ๋ฌธ์์ด
- ๊ตฌํ
- SpringBoot
- LV2
- Study
- ๋ฐฑํธ๋ํน
- ๊น์ด ์ฐ์ ํ์
- DP
- ์๋ฃ๊ตฌ์กฐ
- queue
- Brute Force Algorithm
- ์ ๋ ฌ
- dfs
- greedy
- Java
- ๊ทธ๋ํ ์ด๋ก
- ๊ทธ๋ํ ํ์
- stack
- ๋๋น ์ฐ์ ํ์
- Python
- Dynamic Programming
- BOJ
- sort
- ๊ต์ฌ
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_1504 : ํน์ ํ ์ต๋จ ๊ฒฝ๋ก ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- N๊ฐ์ ๋
ธ๋์ E๊ฐ์ ๊ฐ์ ์ด ์๋ค.
- 1๋ฒ ๋ ธ๋๋ถํฐ N๋ฒ ๋ ธ๋๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋๋ฐ v1๊ณผ v2 ๋ ธ๋๋ฅผ ๊ฒฝ์ ํด์ผ ํ๋ค.
- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉ์ผ๋ก ํ์ด ๊ฐ๋ฅํ๋ค. (๋ ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์๊ฐํ๋ค)
- ๊ฒฝ๋ก๋ 2๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค. (1 > A > B > N , 1 > B > A > N)
- ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ๋ 1 > A, A > B, B > N ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๊ฐ ๊ตฌํด์ผ ํ๋ค.
- ๋ ๋ฒ์งธ ๊ฒฝ์ฐ๋ 1 > B, B > A, A > N ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๊ฐ ๊ตฌํด์ผ ํ๋ค.
- ๋ฌด๋ฐฉํฅ ๊ฐ์ ์ด๋ฏ๋ก A > B์ B > A๋ ๊ฐ๋ค.
- ์ด 3๋ฒ์ ๋ค์ต์คํธ๋ผ๋ก ๊ฐ์ ๊ตฌํ ์ ์๋ค.
- 1๋ถํฐ A์ 1๋ถํฐ B
- A๋ถํฐ B, A๋ถํฐ N
- B๋ถํฐ N
- ๋ ๊ฒฝ์ฐ์์ ๋ ์งง์ ๊ฒฝ์ฐ๋ฅผ ๊ณจ๋ผ ์ถ๋ ฅํ๋ค.
- ๊ฒฝ๋ก๋ 2๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค. (1 > A > B > N , 1 > B > A > N)
๐ธ ์ฝ๋ ๐ธ
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 ArrayList<Edge>[] adjList;
private static int[] dist;
private static final int INF = 200_000_000;
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));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int E = 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 < E; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
adjList[a].add(new Edge(b, c));
adjList[b].add(new Edge(a, c));
}
st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
// prim
dist_init(N + 1);
prim(1);
int StoA = dist[A];
int StoB = dist[B];
// System.out.println(Arrays.toString(dist));
dist_init(N + 1);
prim(A);
int AtoB = dist[B];
int AtoN = dist[N];
// System.out.println(Arrays.toString(dist));
dist_init(N + 1);
prim(B);
int BtoN = dist[N];
// System.out.println(Arrays.toString(dist));
// Output
int res = INF;
int SABN = StoA + AtoB + BtoN;
int SBAN = StoB + AtoB + AtoN;
res = Math.min(res, SABN);
res = Math.min(res, SBAN);
if (AtoB == INF || res == INF)
bw.write("-1");
else {
bw.write(Integer.toString(res));
}
bw.flush();
}
private static void prim(int start) {
PriorityQueue<Edge> pq = new PriorityQueue<>();
pq.add(new Edge(start, 0));
while (!pq.isEmpty()) {
Edge edge = pq.poll();
if (dist[edge.node] < INF) continue;
dist[edge.node] = edge.weight;
for (Edge e : adjList[edge.node]) {
if (dist[e.node] > edge.weight + e.weight)
pq.add(new Edge(e.node, edge.weight + e.weight));
}
}
}
private static void dist_init(int N) {
dist = new int[N];
Arrays.fill(dist, INF);
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์์ ์ฐ์ ์์ ํ์ ์ฌ์ฉ ํ ๊ฐ์ ํด๋์ค Edge๋ฅผ ์ ์ธํ๋ค.
- ๋ ธ๋์ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ธ์ ๋ฆฌ์คํธ ๋ฐฐ์ด adjList๋ฅผ ์ ์ธํ๋ค.
- ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ฐฐ์ด dist๋ฅผ ์ ์ธํ๋ค.
- ๋ฌธ์ ์์ ๊ฐ์ ์ ์ต๋ ์๋ 20๋ง๊ฐ์ด๊ณ , ๊ฐ์ค์น๋ 1,000๊น์ง ์ด๋ฏ๋ก ๋ฌดํ๋ ๊ฐ์ 2์ต์ผ๋ก ๋๊ณ INF์ ์ ์ฅํด์ ์ฌ์ฉํ๋ค.
- 3๋ฒ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ฆฌ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํด ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
- ๊ฒฐ๊ณผ๊ฐ ๋ฌดํ๋๊ฐ ๋์ค๋ฉด -1์ ์ถ๋ ฅํ๋ค.
๐ธ end ๐ธ
- ๋ค์ต์คํธ๋ผ ํ์ฉ ๋ฌธ์ ๋ก ๊ฐ๋จํ ๊ฒ ๊ฐ์๋ฐ, ํ๋๋ ์์ฃผ ๊ณ ์์ ๋ง์ด ํ ๋ฌธ์ ์ด๋ค.
- ์ฒ์์ BFS๋ก ์ ๊ทผํด์ v1, v2 ๋ ธ๋ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํ์์ ๋ค๊ณ ๋ค๋ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฌ๋ค.
- ๋ ๋ฒ์งธ๋ก ๋ค์ต์คํธ๋ผ + ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๋ค๊ณ ๋ค๋๊ธฐ์๋๋ฐ ๋ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฌ๋ค.
- ๊ฒฐ๊ตญ ํ์ด ํฌ์คํ ์ ์ฐธ๊ณ ํ๋ค. (ํ์ด ํฌ์คํ )
- 75%์์ 2๋ฒ ํ๋ ธ๋๋ฐ, ์ถ๋ ฅ ๊ฒฐ๊ณผ๊ฐ -1์ด ์ ์ฐํ์ง ์์์ ๊ทธ๋ฌ๋ค.
- ์ต์ข ๊ฒฐ๊ณผ๊ฐ -1์ด ์ ๋์์ผํ๋๋ฐ, INF ๊ฐ์ Integer.MAX_VALUE๋ก ๋๋ฉด overflow๊ฐ ๋์ ์ ๋๋ก ๊ณ์ฐ๋์ง ์์๋ค.
- INF๋ฅผ ๋ฐ๋ก 2์ต์ผ๋ก ์ ์ธํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ๋ค.
- ๋ค์ต์คํธ๋ผ๋ผ๊ณค ํ์ง๋ง ํ์ด๋ฅผ ๋ณด๋ ํ๋ฆผ์ ๊ฐ๊น๋ค๊ณ ์๊ฐํด์ ๋ฉ์๋ ๋ช ์ prim์ผ๋ก ํ์ดํ๋ค.
- ์๊ฐ๋ณด๋ค ๋๋ฌด ๊ณ ์ํด์ ๋ค์ต์คํธ๋ผ ์ฐ์ต์ด ๋ ํ์ํ๋ค๊ณ ์ ์คํ ๋๊ผ๋ค.
728x90
'CodingTest > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ_1918 : ํ์ ํ๊ธฐ์ (0) | 2023.07.09 |
---|---|
BOJ_1753 : ์ต๋จ๊ฒฝ๋ก (0) | 2023.07.02 |
BOJ_1238 : ํํฐ (0) | 2023.06.27 |
BOJ_1167 : ํธ๋ฆฌ์ ์ง๋ฆ (0) | 2023.06.25 |
BOJ_15663 : N๊ณผ M (9) (0) | 2023.06.11 |