[Boj_1504] ํน์ ํ ์ต๋จ ๊ฒฝ๋ก
๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1504
1504๋ฒ: ํน์ ํ ์ต๋จ ๊ฒฝ๋ก
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ N๊ณผ ๊ฐ์ ์ ๊ฐ์ E๊ฐ ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) ๋์งธ ์ค๋ถํฐ E๊ฐ์ ์ค์ ๊ฑธ์ณ์ ์ธ ๊ฐ์ ์ ์ a, b, c๊ฐ ์ฃผ์ด์ง๋๋ฐ, a๋ฒ ์ ์ ์์ b๋ฒ ์ ์ ๊น์ง ์๋ฐฉํฅ ๊ธธ์ด ์กด
www.acmicpc.net
โธ ๋ฌธ์
๋ฐฉํฅ์ฑ์ด ์๋ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ค. ์ธ์ค์ด๋ 1๋ฒ ์ ์ ์์ N๋ฒ ์ ์ ์ผ๋ก ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์ด๋ํ๋ ค๊ณ ํ๋ค. ๋ํ ์ธ์ค์ด๋ ๋ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์ ์ด๋ํ๋ ํน์ ํ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๊ณ ์ถ์๋ฐ, ๊ทธ๊ฒ์ ๋ฐ๋ก ์์๋ก ์ฃผ์ด์ง ๋ ์ ์ ์ ๋ฐ๋์ ํต๊ณผํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์ธ์ค์ด๋ ํ๋ฒ ์ด๋ํ๋ ์ ์ ์ ๋ฌผ๋ก , ํ๋ฒ ์ด๋ํ๋ ๊ฐ์ ๋ ๋ค์ ์ด๋ํ ์ ์๋ค. ํ์ง๋ง ๋ฐ๋์ ์ต๋จ ๊ฒฝ๋ก๋ก ์ด๋ํด์ผ ํ๋ค๋ ์ฌ์ค์ ์ฃผ์ํ๋ผ. 1๋ฒ ์ ์ ์์ N๋ฒ ์ ์ ์ผ๋ก ์ด๋ํ ๋, ์ฃผ์ด์ง ๋ ์ ์ ์ ๋ฐ๋์ ๊ฑฐ์น๋ฉด์ ์ต๋จ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ N๊ณผ ๊ฐ์ ์ ๊ฐ์ E๊ฐ ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) ๋์งธ ์ค๋ถํฐ E๊ฐ์ ์ค์ ๊ฑธ์ณ์ ์ธ ๊ฐ์ ์ ์ a, b, c๊ฐ ์ฃผ์ด์ง๋๋ฐ, a๋ฒ ์ ์ ์์ b๋ฒ ์ ์ ๊น์ง ์๋ฐฉํฅ ๊ธธ์ด ์กด์ฌํ๋ฉฐ, ๊ทธ ๊ฑฐ๋ฆฌ๊ฐ c๋ผ๋ ๋ป์ด๋ค. (1 ≤ c ≤ 1,000) ๋ค์ ์ค์๋ ๋ฐ๋์ ๊ฑฐ์ณ์ผ ํ๋ ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ ์ ๋ฒํธ v1๊ณผ v2๊ฐ ์ฃผ์ด์ง๋ค. (v1 ≠ v2, v1 ≠ N, v2 ≠ 1) ์์์ ๋ ์ ์ u์ v์ฌ์ด์๋ ๊ฐ์ ์ด ์ต๋ 1๊ฐ ์กด์ฌํ๋ค.
โธ ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ ๊ฐ์ ์ ์ ์ ์ง๋๋ ์ต๋จ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค. ๊ทธ๋ฌํ ๊ฒฝ๋ก๊ฐ ์์ ๋์๋ -1์ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 4
- ๐ ๋ฌธ์ ์ ํ : ๊ทธ๋ํ ์ด๋ก , ๋ฐ์ดํฌ์คํธ๋ผ, ์ต๋จ ๊ฒฝ๋ก
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
- ๊ฐ ๋ ธ๋์ ์ฐ๊ฒฐ๋ [์ ์ , ๋น์ฉ]์ ์ ์ฅํ ์ธ์ ๋ฆฌ์คํธ์ ์์์ ์์ ๊ฐ ์ ์ ์ผ๋ก ๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ dist ๋ฐฐ์ด์ ๋ง๋ค์ด์ฃผ์๋ค.
- ๋ฐฉํฅ์ฑ์ด ์๋ ๊ทธ๋ํ์ด๋ฏ๋ก ์๋ฐฉํฅ ๊ทธ๋ํ๋ฅผ ์ธ์ ๋ฆฌ์คํธ๋ก ํํํด ์ฃผ์๋ค.
- dist ๋ฐฐ์ด์ ์ด๊น๊ฐ INF๋ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋์ง ์๋๋ก ์ต๋ ๊ฐ์ ๊ฐ์ * ์ต๋ ๊ฑฐ๋ฆฌ์ธ 200000000์ผ๋ก ์ค์ ํด ์ฃผ์๋ค.
- ์์๋ก ์ฃผ์ด์ง ๋ ์ ์ (u, v)์ ๋ฐ๋์ ํต๊ณผํด์ผ ํ๋ฏ๋ก ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋๋์ด ์๊ฐํ๋ค.
- i -> u -> v -> n
- i -> v -> u -> n
- 1๋ฒ์ ๊ฒฝ์ฐ, 1์์ u๊น์ง ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ํ, u์์ v๊น์ง ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ํ, v์์ n๊น์ง ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํํ์ฌ ๊ฐ๊ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ์ ๋ํด ๋ชจ๋ ๋ํด์ค๋ค.
- 2๋ฒ์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๋ชจ๋ ๋ํด์ค ํ, 1๋ฒ์์ ๊ตฌํ ๊ฒฐ๊ด๊ฐ์ ๋น๊ตํ์ฌ ๋ ์์ ๊ฐ์ผ๋ก ์ถ๋ ฅํ๋ค.
- ์ด๋, 1๋ฒ์ ๊ฒฝ์ฐ์ 2๋ฒ์ ๊ฒฝ์ฐ์์ ์ป์ด๋ธ ๊ฐ์ด INF๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๋ฉด u, v๋ฅผ ๊ฑฐ์ณ n์ ๋๋ฌํ ์ ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก -1์ ์ถ๋ ฅํ๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 68612KB
์๊ฐ : 820ms
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static int n, e;
static int u, v;
static ArrayList<ArrayList<pos>> list;
static int[] dist;
static boolean[] checked;
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 int INF = 200000000; // ์ต๋ ๊ฐ์ ๊ฐ์ * ์ต๋ ๊ฑฐ๋ฆฌ
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken()); // ์ ์ ์ ๊ฐ์
e = Integer.parseInt(st.nextToken()); // ๊ฐ์ ์ ๊ฐ์
list = new ArrayList<>();
for (int i = 0; i <= n; i++) {
list.add(new ArrayList<>());
}
for (int i = 0; i < e; i++) {
st = new StringTokenizer(br.readLine());
// a -> b, b -> a
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
// ๊ทธ ๊ฑฐ๋ฆฌ๊ฐ c
int c = Integer.parseInt(st.nextToken());
// ์๋ฐฉํฅ
list.get(a).add(new pos(b, c));
list.get(b).add(new pos(a, c));
}
// ๋ฐ๋์ ๊ฑฐ์ณ์ผ ํ๋ ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ ์
st = new StringTokenizer(br.readLine());
u = Integer.parseInt(st.nextToken());
v = Integer.parseInt(st.nextToken());
int distA = 0; // u -> v์ผ๋ ์ต๋จ๊ฑฐ๋ฆฌ
distA += dijkstra(1, u);
distA += dijkstra(u, v);
distA += dijkstra(v, n);
int distB = 0; // v -> u์ผ๋ ์ต๋จ๊ฑฐ๋ฆฌ
distB += dijkstra(1, v);
distB += dijkstra(v, u);
distB += dijkstra(u, n);
int ans = (distA >= INF && distB >= INF) ? -1 : Math.min(distA, distB);
bw.append(ans + "\n");
bw.flush();
bw.close();
br.close();
}
private static int dijkstra(int start, int end) {
dist = new int[n+1];
Arrays.fill(dist, INF);
pq = new PriorityQueue<>();
pq.offer(new pos(start, 0));
checked = new boolean[n+1];
dist[start] = 0;
while (!pq.isEmpty()) {
pos now = pq.poll();
checked[now.end] = true;
for (pos next : list.get(now.end)) {
if (!checked[next.end] && 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[end];
}
}
๐ ํจ๊ป ํ์ด๋ณด๋ฉด ์ข์ ๋ฐฑ์ค ๋ฌธ์