用并查集把有关系的人并在一起,采用动态规划求最大值

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