水题
并查集搭配背包的一个应用:
题意了然,把认识某个人的花费当做石头所占空间,把认识他的回报当做石头价值。
如果可以获得此石头,就进行状态更新
用并查集来看能不能获得此石头(认识这个人)
[此题链接](https://ac.nowcoder.com/acm/problem/14348)
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ul;
int arr[10005];
int get1[10005];
int fa[10005];
int dp[10005];
int fin(int x)
{
if(fa[x]!=x)
{
fa[x]=fin(fa[x]);
}
return fa[x];
}
void mer(int a,int b)
{
int ra=fin(a);
int rb=fin(b);
if(ra!=rb)
{
fa[ra]=rb;
}
}
int main()
{
int test;
int a,people,energy;
while(scanf("%d",&test)!=EOF)
{
while(test--)
{
cin>>a>>people>>energy;
for(int i=1; i<=a; i++)
fa[i]=i;
for(int i=2; i<=a; i++)
{
cin>>arr[i]>>get1[i];
}
int x,b;
for(int i=0; i<people; i++)
{
cin>>x>>b;
mer(x,b);
}
memset(dp,0,sizeof(dp));
for(int i=2; i<=a; i++)
{
if(fin(i)==fin(1))
{
for(int V=energy; V>=arr[i]; V--)
{
dp[V]=max(dp[V],dp[V-arr[i]]+get1[i]);
}
}
}
cout<<dp[energy]<<endl;
}
}
return 0;
}