๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/18352
18352๋ฒ: ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ
์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ N, ๋๋ก์ ๊ฐ์ M, ๊ฑฐ๋ฆฌ ์ ๋ณด K, ์ถ๋ฐ ๋์์ ๋ฒํธ X๊ฐ ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) ๋์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์ ๊ฑธ์ณ์ ๋ ๊ฐ
www.acmicpc.net
โธ ๋ฌธ์
์ด๋ค ๋๋ผ์๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง์ ๋์์ M๊ฐ์ ๋จ๋ฐฉํฅ ๋๋ก๊ฐ ์กด์ฌํ๋ค. ๋ชจ๋ ๋๋ก์ ๊ฑฐ๋ฆฌ๋ 1์ด๋ค.
์ด ๋ ํน์ ํ ๋์ X๋ก๋ถํฐ ์ถ๋ฐํ์ฌ ๋๋ฌํ ์ ์๋ ๋ชจ๋ ๋์ ์ค์์, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์ ํํ K์ธ ๋ชจ๋ ๋์๋ค์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋ํ ์ถ๋ฐ ๋์ X์์ ์ถ๋ฐ ๋์ X๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ ํญ์ 0์ด๋ผ๊ณ ๊ฐ์ ํ๋ค.
์๋ฅผ ๋ค์ด N=4, K=2, X=1์ผ ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ทธ๋ํ๊ฐ ๊ตฌ์ฑ๋์ด ์๋ค๊ณ ๊ฐ์ ํ์.
์ด ๋ 1๋ฒ ๋์์์ ์ถ๋ฐํ์ฌ ๋๋ฌํ ์ ์๋ ๋์ ์ค์์, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ 2์ธ ๋์๋ 4๋ฒ ๋์ ๋ฟ์ด๋ค. 2๋ฒ๊ณผ 3๋ฒ ๋์์ ๊ฒฝ์ฐ, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ 1์ด๊ธฐ ๋๋ฌธ์ ์ถ๋ ฅํ์ง ์๋๋ค.
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ N, ๋๋ก์ ๊ฐ์ M, ๊ฑฐ๋ฆฌ ์ ๋ณด K, ์ถ๋ฐ ๋์์ ๋ฒํธ X๊ฐ ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) ๋์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์ ๊ฑธ์ณ์ ๋ ๊ฐ์ ์์ฐ์ A, B๊ฐ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. ์ด๋ A๋ฒ ๋์์์ B๋ฒ ๋์๋ก ์ด๋ํ๋ ๋จ๋ฐฉํฅ ๋๋ก๊ฐ ์กด์ฌํ๋ค๋ ์๋ฏธ๋ค. (1 ≤ A, B ≤ N) ๋จ, A์ B๋ ์๋ก ๋ค๋ฅธ ์์ฐ์์ด๋ค.
โธ ์ถ๋ ฅ
X๋ก๋ถํฐ ์ถ๋ฐํ์ฌ ๋๋ฌํ ์ ์๋ ๋์ ์ค์์, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ K์ธ ๋ชจ๋ ๋์์ ๋ฒํธ๋ฅผ ํ ์ค์ ํ๋์ฉ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํ๋ค.
์ด ๋ ๋๋ฌํ ์ ์๋ ๋์ ์ค์์, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ K์ธ ๋์๊ฐ ํ๋๋ ์กด์ฌํ์ง ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ์ค๋ฒ 2
- ๐ ๋ฌธ์ ์ ํ : ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ๋๋น ์ฐ์ ํ์, ๋ฐ์ดํฌ์คํธ๋ผ, ์ต๋จ ๊ฒฝ๋ก
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
- ๊ฐ ๋ ธ๋์ ์ฐ๊ฒฐ๋ [์ ์ , ๋น์ฉ]์ ์ ์ฅํ ์ธ์ ๋ฆฌ์คํธ์ ์์์ ์์ ๊ฐ ์ ์ ์ผ๋ก ๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ dist ๋ฐฐ์ด์ ๋ง๋ค์ด์ฃผ์๋ค.
- ์์์ ๋ถํฐ ์ฐ๊ฒฐ๋ ์ ์ ๋ค์ ๋ฐฉ๋ฌธํ๋ฉฐ, ๋์ฐฉ์ง๋ก ๊ฐ๋ ๊ฐ์ค์น๊ฐ ๋ ์์ ๊ฐ์ด ์๋ค๋ฉด ๊ฐฑ์ ํด ์ฃผ์๋ค.
- ์ถ๋ฐ์ง์์ ๊ฐ ์ ์๋ ๋ชจ๋ ๋์ ์ค dist ๋ฐฐ์ด์ ์ ์ฅ๋ ์ต๋จ๊ฑฐ๋ฆฌ์ k๊ฐ ๊ฐ์ ๋์์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํด ์ฃผ์๋ค.
๐ ์ต๋จ ๊ฑฐ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ
- ๊ทธ๋ํ์์ ์ ์ ๊ฐ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก,
- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ, ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ, ํ๋ก์ด๋-์์ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค.
- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ํน์ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ณ ,
- ํ๋ก์ด๋-์์ ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ์ ์ ๊ฐ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค.
๐ ๋ค์ต์คํธ๋ผ(Dijkstra)๋ ?
- ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ์์๊ฐ ์๋ ๊ฒฝ์ฐ ํน์ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ์์ ์ ์ ์ ์ค์ ํ๊ณ , ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ๋ฉด์ ๋น์ฉ์ด ๊ฐ์ฅ ์ ๊ฒ ๋๋ ์ ์ ์ ๋ฐฉ๋ฌธํด ๋น์ฉ์ ๊ฐฑ์ ํ๋ค.
- ์ด๋ ๊ฐ ์ ์ ์ ๋น์ฉ์ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋ฉด ์๊ฐ ๋ณต์ก๋ ๋ฉด์์ ํจ์จ์ ์ผ ์ ์๋ค.
๐ธ ๋ค์ต์คํธ๋ผ ๋์ ๊ณผ์
- ์ด๊ธฐ์ ์์ ์ ์ ์์ ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ ์ ์ ์ ๋ํ ๋น์ฉ์ ๊ฐฑ์ ํ๊ณ , ๋๋จธ์ง ์ ์ ์ ๋ํ ๋น์ฉ์ ๋ฌดํ๋๋ก ์ค์ ํ๋ค.
- ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ค ๋น์ฉ์ด ๊ฐ์ฅ ์ ๊ฒ ๋๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ค.
- ํด๋น ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ ์ ์ ๋น์ฉ์ ๊ฐฑ์ ํด์ผ ํ๋์ง ํ์ธํ๋ค.
- ๋ง์ฝ, ํด๋น ์ ์ ์ ๊ฑฐ์ณ ๋ค๋ฅธ ์ ์ ์ ๋ฐฉ๋ฌธํ ๋ ๊ธฐ์กด๋ณด๋ค ์ ์ ๋น์ฉ์ด ๋ ๋ค๋ฉด ๋น์ฉ์ ๊ฐฑ์ ํ๋ค.
- ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ ๋๊น์ง, ์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ์ ๋ฐฉ๋ฌธ ๋น์ฉ์ ๊ฐฑ์ ํ๋ค.
๋ฒจ๋ง-ํฌ๋(Bellman-Ford) ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ์์์ธ ๊ฒฝ์ฐ์๋ ์ ์ฉํ ์ ์๋ค. ํ์ง๋ง ์์ ์ฌ์ดํด์ด ์๋ค๋ฉด ์ต์ ๋น์ฉ์ด ๋ฌดํํ๊ฒ ์ค์ด๋ค์ด ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ ์ ์๋ค.
๋ค์ต์คํธ๋ผ | ๋ฒจ๋ง-ํฌ๋ | |
์์ ๊ฐ์ค์น | X | O |
์์ ์ฌ์ดํด | X | X |
์๊ฐ ๋ณต์ก๋ | O(mlog n) | O(mn) |
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 346656KB
์๊ฐ : 1436ms
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, m, k, x;
static ArrayList<ArrayList<pos>> list;
static int[] dist;
static boolean[] checked;
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;
}
}
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()); // ๋๋ก์ ๊ฐ์
k = Integer.parseInt(st.nextToken()); // ๊ฑฐ๋ฆฌ์ ์ ๋ณด
x = Integer.parseInt(st.nextToken()); // ์ถ๋ฐ ๋์์ ๋ฒํธ
list = new ArrayList<>();
for (int i = 0; i <= n; i++) {
list.add(new ArrayList<>());
}
dist = new int[n+1];
Arrays.fill(dist, Integer.MAX_VALUE);
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
list.get(a).add(new pos(b, 1));
}
dijkstra(x);
for (int i = 1; i < dist.length; i++) {
if (dist[i] == k) {
sb.append(i).append("\n");
}
}
if (sb.length() == 0) sb.append(-1).append("\n");
System.out.println(sb.toString());
br.close();
}
private static void dijkstra(int start) {
PriorityQueue<pos> pq = new PriorityQueue<>();
checked = new boolean[n+1];
pq.offer(new pos(start, 0));
dist[start] = 0;
while (!pq.isEmpty()) {
pos now = pq.poll();
int num = now.end;
checked[num] = true;
for (pos next : list.get(num)) {
if (!checked[next.end] && dist[next.end] > dist[num] + next.dist) {
dist[next.end] = dist[num] + next.dist;
pq.offer(new pos(next.end, dist[next.end]));
}
}
}
}
}
๐ ํจ๊ป ํ์ด๋ณด๋ฉด ์ข์ ๋ฐฑ์ค ๋ฌธ์
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_1446] ์ง๋ฆ๊ธธ (0) | 2023.11.21 |
---|---|
[Boj_1504] ํน์ ํ ์ต๋จ ๊ฒฝ๋ก (0) | 2023.11.21 |
[Boj_11279] ์ต๋ ํ (0) | 2023.11.13 |
[Boj_11286] ์ ๋๊ฐ ํ (0) | 2023.11.13 |
[Boj_1927] ์ต์ ํ (0) | 2023.11.13 |