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<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;
}

你可能感兴趣的:(牛客刷题)