技巧
并查集 背包
思路
在连通关系网里面处理背包问题
实现
package main
import (
"bufio"
. "fmt"
"io"
"math"
"os"
)
type Partner struct {
id, a, b, pid int
}
func getRoot(arr []*Partner, id int) *Partner {
if arr[id].pid == id {
return arr[id]
}
r := getRoot(arr, arr[id].pid)
arr[id].pid = r.id
return r
}
// https://ac.nowcoder.com/acm/problem/14545
func NC14545(_r io.Reader, _w io.Writer) {
in, out := bufio.NewReader(_r), bufio.NewWriter(_w)
defer out.Flush()
var T int
for Fscan(in, &T); T > 0; T-- {
var N, M, C int
Fscan(in, &N, &M, &C)
arr := make([]*Partner, N+1)
arr[1] = &Partner{1, 0, 0, 1}
for i := 2; i <= N; i++ {
var a, b int
Fscan(in, &a, &b)
arr[i] = &Partner{i, a, b, i}
}
for i := 0; i < M; i++ {
var x, y int
Fscan(in, &x, &y)
xr, yr := getRoot(arr, arr[x].id), getRoot(arr, arr[y].id)
if xr != yr {
xr.pid = yr.id
}
}
dp := make([]int, C+1)
for i := 2; i <= N; i++ {
if getRoot(arr, arr[1].id) == getRoot(arr, arr[i].id) {
for j := C; j >= arr[i].a; j-- {
dp[j] = int(math.Max(float64(dp[j]), float64(dp[j-arr[i].a]+arr[i].b)))
}
}
}
Fprintln(out, dp[C])
}
}
func main() {
NC14545(os.Stdin, os.Stdout)
}

京公网安备 11010502036488号