๐Ÿ“ Algorithm/๋ฐฑ์ค€

[Swift] ๋ฐฑ์ค€ 14284๋ฒˆ ๊ฐ„์„  ์ด์–ด๊ฐ€๊ธฐ 2

JINiOS 2024. 10. 21. 21:55
728x90

 

๊ฐ„์„  ์ด์–ด๊ฐ€๊ธฐ2 ๋ฌธ์ œ

https://www.acmicpc.net/problem/14284

 

 

 

 

 

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

bfs๋กœ ์ˆœํšŒํ•˜๋ฉฐ, dp ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๋œ๋‹ค. (๋ง์€ ์‰ฝ๋‹ค..!)

 

ํ˜„์žฌ ์ •์ ๊ณผ ๋‹ค์Œ ๋ฐฉ๋ฌธํ•  ์ •์ ๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ,

dp[๋‹ค์Œ์ •์ ]์˜ ๊ฐ€์ค‘์น˜๊ฐ€ dp[ํ˜„์žฌ์ •์ ]์˜ ๊ฐ€์ค‘์น˜+๋‹ค์Œ ์ •์  ๊ฐ€์ค‘์น˜๋ณด๋‹ค ํฌ๋ฉด dp[๋‹ค์Œ์ •์ ]ํ˜„์žฌ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ํ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค.

 

๋‹ค์ต์ŠคํŠธ๋ผ ๋ฌธ์ œ๋ฅผ ํ’€๋•Œ๋Š” ..

๋‹ค์ต์ŠคํŠธ๋ผ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋Š” ์•„๋ž˜ ๋‚ด์šฉ์„ ๊ณ ๋ คํ•˜๋ฉด์„œ ํ’€๋ฉด ๋œ๋‹ค.

 

1. dp ๋ฐฐ์—ด์˜ ์ดˆ๊ธฐ๊ฐ’์„ Int.max๋กœ ๋‘๊ธฐ

2. ๋ฐฉํ–ฅ๊ทธ๋ž˜ํ”„์ธ์ง€ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ธ์ง€ ํ™•์ธํ•ด์„œ ๋”•์…”๋„ˆ๋ฆฌ ์—…๋ฐ์ดํŠธ

3. bfs ์‹œ์ž‘ํ•  ๋•Œ ์‹œ์ž‘๊ฐ’์˜ dp๋Š” 0์ด๋‚˜ ํŠน์ • ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”

4. ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ๋”ฐ๋กœ ์•ˆํ•จ

5. ์Šค์œ„ํ”„ํŠธ๋กœ bfs ํ’€ ๊ฒฝ์šฐ ํ(๋ฐฐ์—ด)์— removeFirst()๋ฅผ ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ธ๋ฑ์Šค๋กœ ํ˜„์žฌ ํ ๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผ ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Œ

6. ์ด๋™๊ฒฝ๋กœ๋„ ์ถœ๋ ฅํ•ด์•ผํ•  ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๋ฐฉ๋ฌธ ๋ฆฌ์ŠคํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

    - ์˜ˆ์‹œ ๋ฌธ์ œ >>  https://www.acmicpc.net/problem/11779

// DP ์ดˆ๊ธฐํ™”
var dp: [(cost: Int, visited: [Int])] = Array(repeating: (cost: Int.max, visited: []), count: n+1)

// ๊ฐ€์ค‘์น˜ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐฉ๋ฌธํ•œ ๋ฆฌ์ŠคํŠธ๋„ ์—…๋ฐ์ดํŠธ
dp[nq].visited = dp[q].visited + [nq]

 

 

์†Œ์Šค์ฝ”๋“œ

let nm = readLine()!.split(separator: " ").map { Int($0)! }
let (n,m) = (nm[0], nm[1])

var dic: [Int: [(end: Int, weight: Int)]] = [:]
for _ in 0..<m {
    let tmp = readLine()!.split(separator: " ").map { Int($0)! }
    let (st, end, cost) = (tmp[0], tmp[1], tmp[2])
    dic[st, default: []].append((end, cost))
    dic[end, default: []].append((st, cost))
}
let tmp = readLine()!.split(separator: " ").map { Int($0)! }
let (start, end) = (tmp[0], tmp[1])
var dp: [Int] = Array(repeating: Int.max, count: n+1)

var queue: [Int] = [start]
dp[start] = 0

var idx = 0

while queue.count > idx {
    let q = queue[idx]
    
    let nqList = dic[q, default: []]
    for (nq, nweight) in nqList {
        if dp[nq] >= dp[q] + nweight {
            dp[nq] = dp[q] + nweight
            queue.append(nq)
        }
    }
    idx += 1
}
print(dp[end])

 

 

 

 

 

728x90