π Algorithm/λ°±μ€
[Swift] λ°±μ€ 14938λ² μκ° κ·ΈλΌμ΄λ
JINiOS
2024. 10. 30. 18:53
728x90
μκ° κ·ΈλΌμ΄λ
https://www.acmicpc.net/problem/14938
νμ΄
λ€μ΅μ€νΈλΌ
1. 1λΆν° NκΉμ§ BFS λ°λ³΅νλ©΄μ μ΅λκ° μ λ°μ΄νΈ
2. λ€μ νμ cost λνμ λ μμλ²μ μμ΄κ³ , λ€μ νμ κ°―μλ₯Ό λνμ λ νμ¬ μμ΄ν κ°―μλ³΄λ€ ν¬λ€λ©΄ νμ μΆκ°νκΈ°
3. νμ λ€μ΄κ° μμ΄ν λ€μ μ λΆ κ° μ μμΌλ―λ‘ Setλ‘ κ΄λ¦¬. bfs λλ ν Setμ λ€μ΄μλ μμ΄ν μ ν΄λΉνλ λΉμ© μΆκ°ν΄μ bfs λ°ν
μμ€μ½λ
let NMR = readLine()!.split(separator: " ").map { Int($0)! }
let N = NMR[0], M = NMR[1], R = NMR[2]
var items: [Int] = [0]
items += (readLine()!.split(separator: " ").map { Int($0)! })
var roads: [Int :[(ed: Int, cost: Int)]] = [:]
for _ in 0..<R {
let tmp = readLine()!.split(separator: " ").map { Int($0)! }
roads[tmp[0], default: []].append((tmp[1], tmp[2]))
roads[tmp[1], default: []].append((tmp[0], tmp[2]))
}
func bfs(_ st: Int) -> Int {
var curItem: [Int] = Array(repeating: 0, count: N+1)
var que: [(Int, Int)] = [(st, 0)] // λ€μ μ§μ, νμ¬ μμλ²μ
var vis = Set<Int>()
vis.insert(st)
var idx = 0
var res = 0
while que.count > idx {
let (q, qLimit) = que[idx]
for (nq, ncost) in roads[q, default: []] {
if nq == st { continue } // λ€μ νκ° μμ μ§μμ΄λΌλ©΄ λμ΄κ°κΈ°
if qLimit + ncost > M { continue } // λ€μ νλ₯Ό μΆκ°νμ λ μμλ²μ λ³΄λ€ μ»€μ§λ©΄ λμ΄κ°κΈ°
// νμ¬ μμ΄ν
κ°μ λ€μ μμ΄ν
κ°μ ν¬ν¨νκ², νμ¬λ³΄λ€ ν¬λ©΄
if items[nq] + curItem[q] > curItem[nq] {
que.append((nq, ncost + qLimit))
curItem[nq] = items[nq] + curItem[q]
vis.insert(nq)
}
}
idx += 1
}
for vi in vis {
res += items[vi]
}
return res
}
var maxRes = 0
for i in 1...N {
let res = bfs(i)
maxRes = max(res, maxRes)
}
print(maxRes)
λ°λ‘ λͺ¨μ
λ°λ‘ 1
5 5 4
5 7 8 2 3
1 4 1
5 2 4
3 2 3
1 2 3
μ λ΅: 25
λ°λ‘ 2
5 5 5
1 2 3 4 5
1 2 2
1 3 4
1 4 2
2 3 4
4 5 2
μ λ΅: 15
728x90