๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/20160
โธ ๋ฌธ์
์ผ์ฟ ๋ฅดํธ๋ฅผ ์ธ์น๋ฉฐ ์ ์์ ๊นผ๋ค. ์ค๋์ ์ผ์ฟ ๋ฅดํธ๋ก ํ๋ฃจ๋ฅผ ์์ํ๋ ค๊ณ ํ๋ค.
์ผ์ฟ ๋ฅดํธ ์์ค๋ง๋ 10๊ฐ์ ์ง์ ์ ์ต๋จ ์๊ฐ์ผ๋ก ์ด๋ํ๋ฉฐ ๋ค๋ฆฌ์ ๋ค. ๊ฐ ์ง์ ์์ ์ผ์ฟ ๋ฅดํธ ์์ค๋ง๋ณด๋ค ๊ฐ๊ฑฐ๋ ๋ ์ผ์ฐ ๋์ฐฉํ ์ฌ๋์๊ฒ ์ผ์ฟ ๋ฅดํธ๋ฅผ ํ๊ณ ๋ฐ๋ก ๋ค์ ์ง์ ์ผ๋ก ์ถ๋ฐํ์ ๋ค. ๊ฐ ์ง์ ์ ์ ์ ์์ ์๊ณ ์ง์ ๋ ์ฐจ๋ก์๋ง ์ผ์ฟ ๋ฅดํธ๋ฅผ ํ๋งคํ๋ค. ์ผ์ฟ ๋ฅดํธ๋ฅผ ํ๋ ๋ฐ ์ง์ฐ๋๋ ์๊ฐ์ ์์ผ๋ฉฐ, ์ค์ง ์ด๋ ์์๋ง ํด๋น ๋๋ก์ ๊ฐ์ค์น๋งํผ ์๊ฐ์ด ์ง์ฐ๋๋ค.
์ผ์ฟ ๋ฅดํธ ์์ค๋ง๋ 10๊ฐ์ ์ง์ ์ ์์๋๋ก ๋ฐฉ๋ฌธํ๋ฉฐ, 10๊ฐ์ ์ง์ ์ค ์ฒซ ๋ฒ์งธ ์ง์ ์์ ์ถ๋ฐํ๋ค. ๋ง์ฝ i๋ฒ์งธ ์ง์ ์์ i+1๋ฒ์งธ ์ง์ ์ผ๋ก ์ด๋ ๊ฐ๋ฅํ ๊ฒฝ๋ก๊ฐ ์๋ค๋ฉด i+2์ง์ ์ผ๋ก ์ด๋ํ์ ๋ค. i+2๋ก ๊ฐ ์ ์์ผ๋ฉด i+3, i+4...(≤ V)๋ก ์ด๋ํ์ ๋ค.
๋ด๊ฐ ์ถ๋ฐํ๋ ์๊ฐ๊ณผ ์ผ์ฟ ๋ฅดํธ ์์ค๋ง๊ฐ ์ถ๋ฐํ๋ ์๊ฐ์ ๊ฐ๋ค.
๋ด๊ฐ ์ถ๋ฐํ๋ ์ ์ ๋ฒํธ์ ์ผ์ฟ ๋ฅดํธ ์์ค๋ง์ ๋์ ์ ์๋ ค์ฃผ๋ฉด ์ด๋ ์ง์ ์ผ๋ก ๊ฐ์ผ ์ผ์ฟ ๋ฅดํธ๋ฅผ ์ด ์ ์์์ง ์๋ ค์ค!!
โธ ์ ๋ ฅ
์ฒซ ์ค์๋ ์ ์ ์ ๊ฐ์ V(1 ≤ V ≤ 10,000)์ ๋๋ก์ ๊ฐ์ E(0 ≤ E ≤ 100,000)๊ฐ ์ ์๋ก ์ฃผ์ด์ง๋ค.
๊ทธ ๋ค์ E ์ค์ ๊ฑธ์ณ ๊ฐ ๋๋ก๋ฅผ ๋ํ๋ด๋ ์ธ ๊ฐ์ ์ ์ (u, v, w)๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค. ์ด๋ u ์ v(1 ≤ u, v ≤ V) ์ฌ์ด์ ๊ฐ์ค์น๊ฐ w(1 ≤ w ≤ 100,000)์ธ ๋๋ก๊ฐ ์กด์ฌํ๋ค๋ ๋ป์ด๋ค. ์ ์ ์ฌ์ด์๋ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ด ์กด์ฌํ ์๋ ์์์ ์ ์ํ๋ค.
E+2๋ฒ์งธ ์ค์๋ ์ผ์ฟ ๋ฅดํธ ์์ค๋ง๊ฐ ์ผ์ฟ ๋ฅดํธ๋ฅผ ํ๋ 10๊ฐ ์ง์ ์ ์ ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. E+3๋ฒ์งธ ์ค์๋ ๋ด๊ฐ ์ถ๋ฐํ๋ ์ ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค.
โธ ์ถ๋ ฅ
์ผ์ฟ ๋ฅดํธ๋ฅผ ์ด ์ ์๋ ์ ์ ์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ๊ทธ ์ค ๊ฐ์ฅ ์์ ์ ์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ค.
์ผ์ฟ ๋ฅดํธ๋ฅผ ์ด ์ ์๋ค๋ฉด -1์ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 3
- ๐ ๋ฌธ์ ์ ํ : ๊ทธ๋ํ ์ด๋ก , ์ต๋จ ๊ฒฝ๋ก, ๋ฐ์ดํฌ์คํธ๋ผ
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ ํ ์ ์๋ ๋ฌธ์ ์๋ค.
๋จผ์ , ์ผ์ฟ ๋ฅดํธ ์์ค๋ง๊ฐ 10๊ฐ์ ์ง์ ์ ์์ฐจ์ ์ผ๋ก ๋ฐฉ๋ฌธํ ๋ ์ต์ ๋น์ฉ์ ๊ตฌํ๋ค.
์ด๋, ์์ค๋ง๊ฐ i ๋ฒ์งธ ์ง์ ์์ i+1๋ฒ์งธ ์ง์ ์ผ๋ก ๊ฐ ์ ์๋ ๊ฒฝ์ฐ
์ฆ, ๋น์ฉ์ด INF์ธ ๊ฒฝ์ฐ๋ผ๋ฉด i+2๋ฒ์งธ ์ง์ ์ผ๋ก ๊ฐ์ผ ํ๋ค.
๋ํ, ์ฌ๊ธฐ์ ๋์ฌ ์ ์๋ ๋น์ฉ์ ์ต๋๊ฐ์ 10,000(์ต๋ ์ ์ ์ ๊ฐ์) * 100,000(๊ฐ์ค์น ์ต๋๊ฐ) = 10์ต์ด๋ค.
์์ค๋ง๊ฐ 1 โก 2 โก 1 โก 2 โก 1๋ก ์ง์ ์ ๋ฐฉ๋ฌธํ๋ค๊ณ ๊ฐ์ ํด ๋ณด์
1 โก 2๋ก ๊ฐ๋ ์ต์ ๋น์ฉ์ด ์ต์ ์ผ๋ก 10์ต์ด๊ณ , 2 โก 1๋ก ๊ฐ๋ ๋น์ฉ๋ ์ต์ ์ผ๋ก 10์ต์ด๋ผ๋ฉด
์์ค๋ง๊ฐ ์ง์ ์ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ๋์ ๋๋ ์๊ฐ์ ์๋์ ๊ฐ๋ค.
1 โก 2 : 10์ต
2 โก 1 : (์ด์ 10์ต) + 10์ต
1 โก 2 : (์ด์ 20์ต) + 10์ต
2 โก 1: (์ด์ 30์ต) + 10์ต
์ฆ, ์์ค๋ง๊ฐ ์ง์ ์ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ์ด์ ๋ฐฉ๋ฌธ ์๊ฐ๊น์ง ๊ฐ์ด ๋์ ํด์ ์ ์ฅํด ์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์,
์ต์ ์ ๊ฒฝ์ฐ intํ์ ๋ฒ์๋ฅผ ๋๊ฒ ๋๋ฏ๋ก longํ์ผ๋ก ์ ์ธํ์ฌ ๊ฐ์ ๋์ ํด์ ๋ํด์ฃผ์ด์ผ ํ๋ค.
๋ค์์ผ๋ก๋ ๋ด๊ฐ ์ถ๋ฐํ๋ ์ง์ ์์ ๋ค๋ฅธ ์ง์ ๊น์ง ๊ฐ๋ ์ต์ ๋น์ฉ์ ๊ตฌํ๋ค.
์์ค๋ง๊ฐ i ๋ฒ์งธ ์ง์ ์ ๋ฐฉ๋ฌธํ ์ ์๊ณ ,
๋ด๊ฐ ์์ค๋ง๋ณด๋ค i ๋ฒ์งธ ์ง์ ์ ๋จผ์ ๋์ฐฉํ๋ ๊ฒฝ์ฐ์๋ง ์ ๋ต์ ๊ฐฑ์ ํ๋ค.
์ ํ์ด๋๋ก ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 67096KB
์๊ฐ : 700ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static int v, e;
static ArrayList<ArrayList<Pos>> list;
static PriorityQueue<Pos> pq;
static public class Pos implements Comparable<Pos> {
int end; int dist;
public Pos (int end, int dist) {
this.end = end; this.dist = dist;
}
@Override
public int compareTo(Pos o) {
return this.dist - o.dist;
}
}
static final int INF = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
v = Integer.parseInt(st.nextToken()); // ์ ์ ์ ๊ฐ์
e = Integer.parseInt(st.nextToken()); // ๋๋ก์ ๊ฐ์
list = new ArrayList<>();
for (int i = 0; i <= v; i++) {
list.add(new ArrayList<>());
}
int u, v, w;
for (int i = 0; i < e; i++) {
st = new StringTokenizer(br.readLine());
u = Integer.parseInt(st.nextToken());
v = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
list.get(u).add(new Pos(v, w));
list.get(v).add(new Pos(u, w));
}
// ์ผ์ฟ ๋ฅดํธ ์์ค๋ง๊ฐ ๋ฐฉ๋ฌธํ๋ ์์
int[] yogurtNode = new int[10];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 10; i++) {
yogurtNode[i] = Integer.parseInt(st.nextToken());
}
// i๋ฒ์งธ ์ง์ ๊น์ง ์ค๋๋ฐ ์์๋๋ ์๊ฐ
long[] yogurtCome = new long[10];
Arrays.fill(yogurtCome, Long.MAX_VALUE);
yogurtCome[0] = 0;
int cur = yogurtNode[0];
int curIdx = 0;
for (int i = 1; i < 10; i++) {
int next = yogurtNode[i];
// ํ์ฌ ๋
ธ๋์์ ๋ค์ ๋
ธ๋๊น์ง์ ์ต์๊ฑฐ๋ฆฌ
int minDist = dijkstra(cur)[next];
// ์ด๋ ๊ฒฝ๋ก๊ฐ ์๋ค๋ฉด ๊ทธ ๋ค์ ์ ์ ์ผ๋ก
if (minDist == INF) continue;
// ์ด์ ๋ฐฉ๋ฌธ์๊ฐ๊น์ง ๊ฐ์ด ๋์
yogurtCome[i] = minDist + yogurtCome[curIdx];
cur = next;
curIdx = i;
}
int myStart = Integer.parseInt(br.readLine()); // ๋ด๊ฐ ์ถ๋ฐํ๋ ์ ์ ๋ฒํธ
int[] myDist = dijkstra(myStart);
int ans = INF;
for (int i = 0; i < 10; i++) {
cur = yogurtNode[i];
// ์์ค๋ง๊ฐ i๋ฒ์งธ ์ง์ ์ผ๋ก ์ฌ ์ ์๊ณ ,
// ๋ด๊ฐ ๋ ๋นจ๋ฆฌ ๋์ฐฉํ๋ ๊ฒฝ์ฐ
if (yogurtCome[i] != Long.MAX_VALUE && myDist[cur] <= yogurtCome[i]) {
ans = Math.min(ans, cur);
}
}
System.out.println(ans == INF ? -1 : ans);
}
private static int[] dijkstra(int cur) {
int[] dist = new int[v+1];
Arrays.fill(dist, INF);
pq = new PriorityQueue<>();
pq.offer(new Pos(cur, 0));
dist[cur] = 0;
while (!pq.isEmpty()) {
Pos now = pq.poll();
if (now.dist > dist[now.end]) continue;
for (Pos next : list.get(now.end)) {
if (dist[next.end] > dist[now.end] + next.dist) {
dist[next.end] = dist[now.end] + next.dist;
pq.offer(new Pos(next.end, dist[next.end]));
}
}
}
return dist;
}
}
ํด๊ฒฐ ์๋ฃ ! ๐ฅ
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_1497] ๊ธฐํ์ฝ์ํธ (3) | 2024.12.07 |
---|---|
[Boj_1584] ๊ฒ์ (0) | 2024.11.29 |
[Boj_1464] ๋ค์ง๊ธฐ 3 (0) | 2024.07.19 |
[Boj_1238] ํํฐ (2) | 2024.03.21 |
[Boj_2252] ์ค ์ธ์ฐ๊ธฐ (1) | 2024.01.11 |