【B-经商 并查集+背包】水题
并查集搭配背包的一个应用:
题意了然,把认识某个人的花费当做石头所占空间,把认识他的回报当做石头价值。
如果可以获得此石头,就进行状态更新
用并查集来看能不能获得此石头(认识这个人)
[此题链接](https://ac.nowcoder.com/acm/problem/14348)
#include
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>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<