链接:https://ac.nowcoder.com/acm/problem/14348
来源:牛客网
题意:
小d能与自己的朋友交际,也能与朋友的朋友交际,与每一个人交际都会花费一定的精力,并获得一定的利益,在小d的精力范围内,求最大能获得多少利益。
思路:
朋友的朋友可以用并查集来筛选
然后维护
d
p
[
j
]
=
m
a
x
(
d
p
[
j
]
,
d
p
[
j
−
a
[
i
]
]
+
b
[
i
]
)
dp[j] = max(dp[j],dp[j-a[i]]+b[i])
dp[j]=max(dp[j],dp[j−a[i]]+b[i])
d
p
[
j
]
dp[j]
dp[j]:消耗精力为
j
j
j时获得的最大利益
a
[
i
]
a[i]
a[i]:与第
i
i
i个人交际花费的精力
b
[
i
]
b[i]
b[i]:与第
i
i
i个人交际获得的利益
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int pre[maxn],t,n,m,c,a[maxn],b[maxn],x,y,dp[maxn];
int xfind(int x) {
return pre[x] == x ? x : pre[x] = xfind(pre[x]);
}
int main() {
cin>>t;
while(t--) {
cin>>n>>m>>c;
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++) pre[i]=i;
for(int i=2; i<=n; i++) cin>>a[i]>>b[i];
for(int i=0; i<m; i++) {
cin>>x>>y;
if(xfind(x) != xfind(y)) pre[xfind(x)] = xfind(y);
}
for(int i=2; i<=n; i++) {
if(xfind(1) == xfind(i)) {
for(int j=c; j>=a[i]; j--) {
dp[j] = max(dp[j],dp[j-a[i]]+b[i]);
}
}
}
cout<<dp[c]<<endl;
}
}