用并查集把有关系的人并在一起,采用动态规划求最大值
#include <iostream>
#include <queue>
using namespace std;
const int maxn = 10010;
struct node {
int pre;
int val;
int jingli;
}arr[maxn];
int dp[maxn];
void init() {
for (int i = 0; i <maxn; i++) {
arr[i].pre = i;
arr[i].val = 0;
arr[i].jingli = 0;
}
}
int find(int num) {
return num == arr[num].pre ? num : find(arr[num].pre);
}
void merge_set(int num1,int num2) {
int fa = find(num1);
int fb = find(num2);
if (fa != fb)arr[fb].pre = fa;
}
int main()
{
int t;
cin >> t;
while (t--) {
int n, m, c;
cin >> n >> m >> c;
init();
for (int i = 2; i <= n; i++) {
cin >> arr[i].jingli >> arr[i].val;
}
for (int i = 0; i < m; i++) {
int num1, num2;
cin >> num1 >> num2;
merge_set(num1, num2);
}
for(int i=0;i<maxn;i++){
dp[i]=0;
}
int ans = 0;
for (int i = 2; i <= n; i++) {
if (find(i) == find(1)) {
for (int j = c; j >= arr[i].jingli; j--) {
dp[j] = max(dp[j], dp[j - arr[i].jingli] + arr[i].val);
}
}
}
cout << dp[c]<<endl;
}
}


京公网安备 11010502036488号