题目链接https://ac.nowcoder.com/acm/problem/14545
就是并查集+背包问题
每次背包的时候判断一下这两个人是否可以洽谈就行
关于并查集的知识: https://blog.csdn.net/lanyanzhiji123asd/article/details/88072561
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;
struct node
{
int consu,val;
}mp[10005];
int dp[505],pre[10005];
int find(int n)
{
if(pre[n]==n)
return n;
pre[n]=find(pre[n]);
return pre[n];
}
int main()
{
int t,i,n,m,c,a,b,j;
cin>>t;
while(t--)
{
memset(dp,0,sizeof(dp));
memset(mp,0,sizeof(mp));
cin>>n>>m>>c;
for(i=0;i<=n;i++)
pre[i]=i;
for(i=2;i<=n;i++)
{
cin>>mp[i].consu>>mp[i].val;
}
for(i=0;i<m;i++)
{
cin>>a>>b;
int xx=find(a);
int yy=find(b);
// cout<<xx<<" "<<yy<<endl;
if(xx!=yy)
pre[yy]=xx;
}
int xx=find(1);
// cout<<xx<<" xxx "<<endl;
int yy;
for(i=2;i<=n;i++)
{
yy=find(i);
// cout<<yy<<" yyy "<<endl;
if(xx==yy)
{
for(j=c;j>=mp[i].consu;j--)
{
dp[j]=max(dp[j],dp[j-mp[i].consu]+mp[i].val);
}
}
}
cout<<dp[c]<<endl;
}
}