经商
题意就是找 跟1(也就是自己)在同一个关系的网内的人谈生意 在c精力的条件下获得的最大利益 即01背包
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 10009;
int bcj[N];
int a[N],b[N],dp[N];
int n , m, c;
int Find(int x)
{
int r = x, j, k = x;
while(r != bcj[r]) r = bcj[r];
while(k != r)
{
j = bcj[k];
bcj[k] = r;
k = j;
}
return r;
}
int _Find(int x)
{
return x == bcj[x] ? x : bcj[x] = _Find(bcj[x]);
}
void Union(int x, int y)
{
x = Find(x);
y = Find(y);
if(x != y)
bcj[y] = x;
}
void work()
{
cin >> n >> m >> c;
for(int i = 1; i <= n; ++i) bcj[i] = i;
memset(dp, 0, (c+1)*4);// 注意清空数组所需要的变量 是c不是n wa了无数发才发现
int x, y;
for(int i = 2; i <= n; ++i)
cin >> a[i] >> b[i];
for(int i = 1; i <= m; ++i)
{
cin >> x >> y;
Union(x, y);
}
int t = Find(1);
for(int i = 2; i <= n; ++i)
{
if(Find(i) == t)
{
for(int j = c; j >= a[i]; --j)
{
dp[j] = max(dp[j],dp[j-a[i]]+b[i]);
}
}
}
cout << dp[c] << endl;
/*for(int i = 1; i <= n; ++i)
cout << i << " " << bcj[i] << endl;*/
}
int main()
{
int t;
cin >> t;
while(t--)
work();
return 0;
}