竞赛讨论区 > 并查集加01背包
头像
雨中纸鸢无缘
发布于 2019-03-13 18:54
+ 关注

并查集加01背包

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
int w[10005],v[10005],a[10001];
int findpy(int x){
 if(x==a[x]){
  return a[x];
 }
 return a[x]=findpy(a[x]);
}
int main(){
 int T;
 cin>>T;
 while(T--){
  int n,m,c,x,y;
  cin>>n>>m>>c;
  for(int i=1;i<=n;i++)
  a[i]=i;
  for(int i=2;i<=n;i++)
  cin>>w[i]>>v[i];
  for(int i=0;i<m;i++){
   cin>>x>>y;
   int fx=findpy(x);
   int fy=findpy(y);
   if(fx!=fy){
   a[fx]=fy;
  }
  }
  int py=findpy(1),j=0;
 for(int i=2;i<=n;i++){
  if(findpy(i)==py){
   w[j]=w[i];
   v[j++]=v[i];
  }
 }
 int dp[c+1];
 memset(dp,0,sizeof(dp));
 for(int i=0;i<j;i++){
  for(int k=c;k>=w[i];k--){
   dp[k]=max(dp[k],dp[k-w[i]]+v[i]);
  }
 }
 cout<<dp[c]<<endl;
 }
}

全部评论

(0) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐