1. ๋ฌธ์ ์ค๋ช ๐
๊ฐ์ค์น ์๋ฐฉํฅ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง ๋, ์ถ๋ฐ์ง์์ ๋์ฐฉ์ง ๊น์ง ํ๋ฒ์ ์ด๋์ผ๋ก ๊ฐ์ ธ๊ฐ ์ ์๋ ๋ฌผ๊ฑด์ ์ต๋ ์ค๋์ ๊ตฌํ์ฌ๋ผ.
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: Parametric Search
, Binary_Search
,DFS
- (1) ๊ฐ์ค์น ์๋ฐฉํฅ ๊ทธ๋ํ๋ฅผ ์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํ๋ค.
- (2) ์ด๋ถํ์์ ํ์ฉํด, ํ๋ฒ์ ์ฎ๊ธธ ์ ์๋ ๋ฌผ๊ฑด์ ์ต๋ ์ค๋์ ๊ตฌํ๋ค. (์ด๋ถ ํ์์ ๋ค์๊ณผ ๊ฐ์ด ์งํ ๋๋ค.)
- a. ๋ฌธ์ ์์ ์ฃผ์ด์ง ์ต๋ ์ค๋๊ณผ ์ต์ ์ค๋์ ํ์ฉํด ์ค์๊ฐ์ ๊ตฌํ๋ค.
- b. ํด๋น ์ค์๊ฐ์ ํ ๋ฒ์ ์ฎ๊ธธ ์ ์๋ ์ต๋ ์ค๋์ด๋ผ ์ณค์ ๋, ๋์ฐฉ์ง๊น์ง ์ฎ๊ธฐ๋ ๊ฒ ๊ฐ๋ฅํ์ง ํ์ธํ๋ค.
- c-1. ๊ฐ๋ฅํ๋ค๋ฉด ์ต์ ์ค๋์
ํ ์ค์๊ฐ + 1
์ฌ๋ ค์, ๋ค์์ ๊ตฌํ ์ค์๊ฐ์ ์ํฅ ์กฐ์ ํ๋ค. - c-2 .๋ถ๊ฐ๋ฅํ๋ค๋ฉด ์ต๋ ์ค๋์
ํ ์ค์๊ฐ - 1
์ผ๋ก ๋ด๋ ค์ ๋ค์์ ๊ตฌํ ์ค์๊ฐ์ ํํฅ ์กฐ์ ํ๋ค. - d. ์ต๋ ์ค๋๊ณผ ์ต์ ์ค๋์ด ์๊ฐ๋ฆด ๋๊น์ง a๋ถํฐ ๋ฐ๋ณตํ๋ค.
- (3) (2)-b๋ฅผ ๊ตฌํ๊ธฐ ์ํด DFS๋ฅผ ํ์ฉํ๋ค. ์ถ๋ฐ์ง์์ ์์ํด์, ๋์ฐฉ์ง๊น์ง ํ ์ต๋ ์ค๋ d๋ฅผ ๋ชจ๋ ๋ค๊ณ ๊ฐ ์ ์๋ค๋ฉด true, ์๋๋ค๋ฉด false๋ฅผ ๋ฐํํ๋ค.
(1) Parametric Search ํ์ฉ์ โจ
ํ ๋ฒ์ ์ฎ๊ธธ ์ ์๋ ๋ฌผ๊ฑด์ ์ต๋ ์ค๋
= ๋์ฐฉ์ง๋ก ๊ฐ๋ ๋ฃจํธ๋ง๋ค์ ๊ฐ์ ๊ฐ์ค์น ์ต์๊ฐ ๋ค ์ค ์ต๋๊ฐ
์ด๋ค.
๋ค์๊ณผ ๊ฐ์ด ์กด์ฌํ๋ ๊ทธ๋ํ์์ ์ถ๋ฐ์ง๋ NODE 1
, ๋์ฐฉ์ง๋ NODE 4
๋ผ๊ณ ํด๋ณด์.
๊ทธ๋ฌ๋ฉด ๊ฐ ์ ์๋ ๋ฃจํธ๋ 3๊ฐ์ง ์ด๋ค.
์ฌ๊ธฐ์ ๊ฐ ๋ฃจํธ๋ง๋ค ์์ ์๊ฒ ์ํ๋ ๊ฐ์ค์น ์ค ์ต์๊ฐ์ ํ์ํด๋ณด๋ฉด,
๊ฐ๊ฐ 3,2,4 ์ด๊ณ , ํ ๋ฒ์ ์์ง์์ผ๋ก ์ต๋ํ ๋ง์ ๋ฌผ๊ฑด์ ์ฎ๊ธฐ๋ ค๋ฉด, ์ด๋ก์ ๋ฃจํธ๋ฅผ ๊ณจ๋ผ์ 4๊ฐ ์ฎ๊ฒจ์ผ ํ๋ค.
์ด๋ฌํ ์ต์ ํ ๋ฌธ์ ๋ฅผ DFS๋ก๋ง ํ๋ ค๋ฉด ๋๊ฒ ๋ณต์กํด์ง๋ค. ๊ทธ ์ด์ ๋
- (a) ๋ฃจํธ๊ฐ ๋ช ๊ฐ๊ฐ ๋์ฌ ์ ์๋์ง ์ ๊ธธ์ด ์๋ค.
- (b) (a)๋ฒ ๋๋ฌธ์ ์ง๊ธ๊น์ง ๊ตฌํ ๋ฃจํธ์ ๊ฐ์ ์ต์๊ฐ ์ค์์ ์ต๋๊ฐ์ด ์ง์ง ์ต๋๊ฐ์ด๋ผ๊ณ ํ์ ํ ์ ์๋ค.
์ด๋ฌํ ์ด์ ๋๋ฌธ์ ์ต์ ํ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ์ ๋ฌธ์ ๋ก ๋ฐ๊พธ์ด ํ๊ฒ ๋ค. (Parametric Search)
์ฌ๊ธฐ์๋ f(w)
= ์ต์ ํ๋์ ๋ฃจํธ๋ผ๋ ์ฉ๋ W๋ฅผ ํ ๋ฒ์ ์ฎ๊ธธ ์ ์์ผ๋ฉด true, ์๋๋ฉด false ๋ฐํ
์ ํ์ฉํ๋ค.
๊ทธ๋ฌ๋ฉด ์์ ์์์ฒ๋ผ ์ฌ๋ฌ๊ฐ์ f(w)๋ฅผ ์ป์ ์ ์์ ๊ฒ์ด๊ณ , ์ฐ๋ฆฌ๋ true๊ฐ ๋์จ ๊ฐ๋ค ์ค ์ ์ผ ์ค๋ฅธ์ชฝ ๊ฐ์ w๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
์์๋ f(d)์ ๋ฐฐ์ด ์ ์ฒด๋ฅผ ๊ตฌํด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋ค์์ง๋ง ์ต์์ฉ๋๋ถํฐ ์ต๋์ฉ๋๊น์ง ๋ชจ๋ f(w)๋ฅผ ๊ตฌํ ํ์๋ ์๋ค. ์๋๋ฉด, ์ด๋ถ ํ์์ ํตํด, ๋ต์ด ๋ ์ ์๋ ํ๋ณด ๊ตฐ์ ํจ๊ณผ์ ์ผ๋ก ์ ๊ฑฐํด ๋๊ฐ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ f(w)์ ๋ฐํ๊ฐ์ ๋ชจ์์ด ๋จ์กฐ์
์ธ ์ฑ๊ฒฉ์ ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค.
์ฆ, f(3) = true
๋ฉด f(0) ~ f(2) = true์์ด ๋ณด์ฅ๋๋ค. (๊ฐ์ค์น 3์ ์ฎ๊ธธ ์ ์๋๋ฐ, 0 ~ 2๋ ๋ฌด์กฐ๊ฑด ๋๊ธฐ ๋๋ฌธ)
๋ฐ๋๋ก ๋งํ๋ฉด f(11) = false
์ด๋ฉด, f(12) ~ f(1000000000) = false ์ด๋ค.
(2) DFS ๊ตฌํ โจ
ํ์ฌ ๊ฐ๋ ค๋ ๊ฐ์ค์น๊ฐ ์ด๋ถํ์์ผ๋ก ๊ตฌํ mid ๊ฐ๋ณด๋ค ์๋ค๋ฉด ํ์ฌ ๋์ฐฉ์ง๋ก ๋ณด๋ด๋ ค๋ ์ต๋ ์ค๋์ ๋ณด๋ผ ์ ์๋ค๋ ๋ป์ด๋ค. ์ด ๊ฒฝ์ฐ ๋ฐฉ๋ฌธํ์ง ์๊ณ ์ง๋๊ฐ๋ค.
DFS๋ฅผ ๋ค ๋๋ ธ์ ๋, ๋์ฐฉ์ง์ ๋์ฐฉ ํ์ผ๋ฉด. (๋ฐฉ๋ฌธ ํ์ ๋จ๊ธฐ๊ธฐ) true ๋ฐํํ๊ณ , ์๋๋ฉด false๋ฅผ ๋ฐํํ๋ฉด ๋๋ค.
3. ์ฝ๋ ์๊ฐ ๐
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Set;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
static int N, M, START_POINT, END_POINT;
static int MAX_WEIGHT;
static boolean isValid = false;
static Island [] islands;
static boolean [] isVisited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
islands = new Island [N + 1];
isVisited = new boolean[N + 1];
for (int i = 1; i <= N; i++) {
islands[i] = new Island();
}
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 weight = Integer.parseInt(st.nextToken());
islands[start].add(end, weight);
islands[end].add(start, weight);
MAX_WEIGHT = Math.max(MAX_WEIGHT, weight);
}
st = new StringTokenizer(br.readLine());
START_POINT = Integer.parseInt(st.nextToken());
END_POINT = Integer.parseInt(st.nextToken());
System.out.println(binary_search());
}
public static int binary_search() {
int start = 1;
int end = MAX_WEIGHT;
while (start <= end) {
isVisited[START_POINT] = true;
int mid = start + (end - start)/2;
f(START_POINT, mid);
// System.out.println(isValid);
if(isValid) start = mid + 1;
else end = mid - 1;
Arrays.fill(isVisited, false);
isValid = false;
}
return start-1;
}
public static void f(int v, int min_weight) {
// System.out.printf("NOW NODE: %d \n", v);
// ๊ธฐ์ ์กฐ๊ฑด
if(v == END_POINT) return;
// ๊ณ์ฐ
for(int key : islands[v].keySet()){
if(!isVisited[key]){
if(islands[v].get(key) < min_weight) continue; // ์ต์ ์ค๋์ผ๋ก ๊ฐ ์ ์์ผ๋ฉด ๋์ด๊ฐ๋ค.
isVisited[key] = true;
// System.out.printf("NEXT NODE: %d isVisited: %s \n", key, Arrays.toString(isVisited));
if(isVisited[END_POINT]) isValid = true;
f(key, min_weight);
if(isValid) return;
}
}
}
}
class Island {
HashMap<Integer, Integer> arrivals;
public Island () {
arrivals = new HashMap<>();
}
public void add (int v, int w) {
if(arrivals.containsKey(v)){
if(arrivals.get(v) < w) arrivals.put(v,w);
}else{
arrivals.put(v, w);
}
}
public Set<Integer> keySet() {
return arrivals.keySet();
}
public int get(int v) {
return arrivals.get(v);
}
public String toString() {
return arrivals.toString();
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
DFS์ STACK์ ์ผ๋ค๋ฉด...โจ
๋๋ DFS๋ฅผ ์ฌ๊ท๋ก ๊ตฌํ ํ์ผ๋, ๋ง์ฝ STACK์ผ๋ก ๊ตฌํ ํ๋ค๋ฉด, ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ด๋ isValid๊ฐ ๋ชจ๋ DFS ํจ์ ๋ด์์ ์ฒ๋ฆฌ๊ฐ ๋๋ฏ๋ก ํจ์ฌ ์ฝ๋๊ฐ ๊นจ๋ํ๊ณ ๊ฐ๋ ์ฑ์ด ๋์์ ๊ฒ ๊ฐ๋ค.
๋ฐฉ๋ฌธ ์ฒ๋ฆฌ์ ๋ํ์ฌ โจ
๋ด๊ฐ ์ฒ์์ ํ๋ฆฐ ์ด์ ๋, ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ ๋
ธ๋๋ฅผ ๋ค๋ฅธ ๋ฃจํธ๋ก ๋ ์ฌ ์ ์์ง ์์๊น ์ถ์ด์ DFS๊ฐ ๋๋ ์ดํ์ ๋ค์ ๋ฏธ๋ฐฉ๋ฌธ์ผ๋ก ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๋ฐ๊พธ์๋ค. ํ์ง๋ง, ๋๋ ์ต์ ํ ๋ฌธ์ ๋ฅผ ์ฉ๋ w๋ฅผ ๋์ฐฉ์ง๊น์ง ๊ฐ์ ธ๊ฐ ์ ์๋๊ฐ?
๋ผ๋ ๊ฒฐ์ ๋ฌธ์ ๋ก ๋ฐ๊พธ์๊ธฐ ๋๋ฌธ์, ์ด๋ ๋ฃจํธ๋ก ๊ฐ๋ ๋์ฐฉ์ง๋ง ๊ฐ๋ฉด ๋๊ธฐ ๋๋ฌธ์ True ์ฒ๋ฆฌ๊ฐ ์ด๋ฏธ ๋ ๋
ธ๋๋ฅผ false๋ก ๋ฐ๊ฟ ํ์๊ฐ ์๋ค.