得用并查集存储 不过就不把并查集放到标题上了
然后就是动态规划 校内考试脑残写的贪心 其实那才是我的真实水平蛤蛤蛤
而且这个题动态规划其实很简单 类似背包吧
代码如下
#include<iostream>
#include<cstdio>
#include<cctype>
using namespace std;
#define in = read()
typedef long long ll;
const ll size = 100000 + 1000;
ll n,m,w;
ll c[size],d[size];
ll f[size],father[size];
inline ll read(){
ll num = 0 ,f = 1; char ch = getchar();
while (!isdigit(ch)){
if(ch == '-') f = -1;
ch = getchar();
}
while (isdigit(ch)){
num = num*10 + ch - '0';
ch = getchar();
}
return num*f;
}
ll find(ll x){
if(father[x] != x)
father[x] = find(father[x]);
return father[x];
}
inline void unionn(ll x ,ll y){
x = find(x); y = find(y);
father[y] = x;
c[x] += c[y]; c[y] = 0;
d[x] += d[y]; d[y] = 0;
}
int main(){
n in; m in; w in;
for (int i=1;i<=n;i++){ c[i] in; d[i] in;}
for (int i=1;i<=n;i++)
father[i] = i;
for (int i=1;i<=m;i++){
ll x,y; x in; y in;
if(father[x] != x) unionn(x,y);
else if(father[y] != y) unionn(y,x);
else unionn(x,y);
}
for(int i=1;i<=n;i++){
if(c[i] == 0 && d[i] == 0) continue;
for(int j=w;j>=0;j--)
if(j - c[i] >= 0 && f[j - c[i]] + d[i] > f[j])
f[j] = f[j - c[i]] + d[i];
}
printf("%d",f[w]);
}
//COYG