import java.util.* fun main() { val t = readLine()!!.toInt() for (i in 1..t) { print("Case #$i: ") solve() } } fun solve() { val n = readLine()!!.toInt() val d = readLine()!!.split(' ').map { it.toInt() - 1 } val c = readLine()!!.split(' ').map(String::toLong) val e = LongArray(n) val st = IntArray(n) for (i in st.indices) { st[d[i]]++ } val pq = TreeSet(compareBy> { it.value }.thenBy { it.index }) pq.addAll(st.withIndex()) var ans = 0L while (pq.first().value == 0) { val q = pq.pollFirst()!!.index ans += maxOf(0L, c[q] - e[q]) e[q] = -1L e[d[q]] += c[q] pq.remove(IndexedValue(d[q], st[d[q]])) st[d[q]]-- pq.add(IndexedValue(d[q], st[d[q]])) } for (i in e.indices) if (e[i] != -1L) { var prev = i var cur = d[i] var minn = Long.MAX_VALUE do { val woPrev = maxOf(0L, c[cur] - e[cur]) val wPrev = maxOf(0L, c[cur] - e[cur] - c[prev]) ans += wPrev minn = minOf(minn, woPrev - wPrev) e[cur] = -1 prev = cur cur = d[cur] } while (prev != i) ans += minn } println(ans) }