//01背包 + 并查集

B-经商

https://ac.nowcoder.com/acm/problem/14545

//01背包 + 并查集
#include<bits/stdc++.h>
using namespace std;
int const N=1e4+7;
//int const M=1e5+7;
int t;
//int a[i];
int f[N];
int v[N],w[N];
int dp[505];
int find(int x){
return f[x]==x ? x : f[x]=find(f[x]);
}
int main(){
cin >> t;
while(t--){
int n,m,c;
cin >> n >> m >> c;
for(int i=1;i<=n;++i) f[i]=i;
for(int i=2;i<=n;++i){
cin >> v[i] >> w[i];
}
for(int i=1;i<=m;++i){
int x,y;
cin >> x >> y;
f[find(x)]=find(y);
}
memset(dp,0,sizeof(dp));
for(int i=2;i<=n;++i){
if(find(1)!=find(i)) continue;
for(int j=c;j>=v[i];--j){
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
cout << dp[c] << endl;
}
return 0;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务