rt,求调
#include <bits/stdc++.h>
using namespace std;
const int N = 10005;
int n,m,w,x,y,pos,ff[N];
struct node
{
int num,cost,value;//cost是价格,value是价值,下同
}f[N];//每个云朵初始的编号,价格和价值
struct node2
{
int costt,valuee;
}a[N];//合并后一个集合的总价钱和价值
int find(int k)
{
if (f[k].num == k)
return k;
return f[k].num = find(f[k].num);
}//并查集函数
int main()
{
cin >> n >> m >> w;//n,m,w表示有n朵云,m个搭配和你现有的钱的数目
for (int i = 1;i <= n;i++)
{
f[i].num = i;
cin >> f[i].cost >> f[i].value;
}//输入
for (int i = 1;i <= m;i++)
{
cin >> x >> y;
f[find(x)].num = find(y);
}//并查集操作
for (int i = 1;i <= n;i++)
if (f[i].num != i)
{
f[find(f[i].num)].cost += f[i].cost;//价格
f[i].cost = 0;
f[find(f[i].num)].value += f[i].value;//价值
f[i].value = 0;
}//合并同一个集合云朵的总价格和价值
for (int i = 1;i <= n;i++)
if (f[i].num == i)
{
a[++pos].costt = f[i].cost;
a[pos].valuee = f[i].value;
}//整理到同一个数组中,即去除上一步操作中价值和价格为空的云朵
for (int i = 1;i <= pos;i++)
{
for (int j = w;j >= 1;j--)
if (ff[j] <= ff[j - a[i].costt] + a[i].valuee && j - a[i].costt >= 0)
ff[j] = ff[j - a[i].costt] + a[i].valuee;
}//01背包操作
cout << ff[w] << endl;
return 0;
}