题目链接
题目思路
并查集构图,再用01背包解决
代码实现
#include<bits/stdc++.h> using namespace std; const int Max=1e6; int n,m,c; int fa[Max],dp[Max],cost[Max],value[Max]; void init() { for(int i=1;i<=n;i++) fa[i]=i; } int find(int x) { if(fa[x]!=x) { fa[x]=find(fa[x]); } return fa[x]; } void merge(int x,int y) { int fx=find(x),fy=find(y); fa[find(x)]=fy; } int main() { int t; cin>>t; while(t--) { cin>>n>>m>>c; init(); for(int i=2;i<=n;i++) { cin>>cost[i]>>value[i]; } for(int i=1;i<=m;i++) { int u,v; cin>>u>>v; merge(u,v); } memset(dp,0,sizeof dp); for(int i=2;i<=n;i++) { if(find(i)==find(1)) { for(int j=c;j>=cost[i];j--) dp[j]=max(dp[j],dp[j-cost[i]]+value[i]); } } cout<<dp[c]<<endl; } }