题目描述:
首先呢,小d对人脉关系的获取就是一个并查集,因为并查集的原则就是:朋友的朋友就是我的朋友,亲戚的亲戚就是我的亲戚,所以这个是完美符合并查集的特点的,所以第一步就是将所有能被小d通过渠道交往的人划归到一个子树下,然后不难发现,剩下的就只是一个简单的背包dp了,打模板就好了。
上代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll t,n,m,c,k,l;
int fa[10010],dp[10010]={0};
struct hj{
int a,b;
}mas[10010];
int find(int d){
return fa[d]==d?d:fa[d]=find(fa[d]);
}
void hebin(int z,int x){
//fa[z]=find(fa[x]);
fa[find(z)]=find(x);
}
int main()
{
cin>>t;
while(t--){
memset(mas,0,sizeof(mas));
memset(dp,0,sizeof(dp));
memset(fa,0,sizeof(fa));
cin>>n>>m>>c;
for(int i=2;i<=n;++i){
cin>>mas[i].a>>mas[i].b;
fa[i]=i;
}
fa[1]=1;
for(int i=1;i<=m;++i){
cin>>k>>l;
hebin(k,l);
}
for(int i=2;i<=n;++i){
if(find(i)==find(1)){
for(int j=c;j>=mas[i].a;--j){
dp[j]=max(dp[j],dp[j-mas[i].a]+mas[i].b);
}
}
}
cout<<dp[c]<<endl;
}
return 0;
}
几个小细节:
1.因为是多组样例,每次要把相关数组清0;
2.打字要仔细啊(哭),比如==就不要写成=还死活看不出来了
别的也没什么好讲的,一道水题,虽然我还是wa了一发。