思路
01 背包 + 并查集
Code
#include <bits/stdc++.h> using namespace std; const int N = 10010; int p[N]; int fa[N]; int f[N],v[N],w[N]; int n,m,c; int find(int x){ if(x==fa[x]) return x; return fa[x]=find(fa[x]); } int main(){ int T; cin>>T; while(T--){ cin>>n>>m>>c; for(int i=2;i<=n;i++) cin>>v[i]>>w[i]; for(int i=1;i<=n;i++) fa[i]=i; while(m--){ int a,b; cin>>a>>b; a=find(a),b=find(b); if(a!=b) fa[a]=b; } int t=0; for(int i=2;i<=n;i++) if(find(i)==find(1)) p[++t]=i; for(int i=1;i<=t;i++) { int pos=p[i]; for(int j=c;j>=v[pos];j--) f[j]=max(f[j],f[j-v[pos]]+w[pos]); } cout<<f[c]<<endl; memset(f,0,sizeof f); } return 0; }