#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include<bits/stdc++.h>
#define int long long//防止数据过大
#define endl '\n'
using namespace std;
const int N = 100010;
int n, m, w;
int c[N], v[N],f[N],c1[N],v1[N];
bool vis[N];//标记这个点父节点的数据有没有被统计进去
int cnt=1;//辅助变量,遍历打包好的数据
int dp[N];
int find(int x)
{
return f[x] == x ? x : f[x] = find(f[x]);//寻找f[x]的父节点,并把f[x]的上一级节点设为f[x]的父节点
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> w;
for (int i = 1; i <= n; i++)
{
cin >> c[i] >> v[i];
f[i] = i;//将每个节点的父节点设为自己
}
for (int i = 1; i <= m; i++)
{
int x, y;
cin >> y >> x;
x = find(x);
y = find(y);
if (x == y)continue;
f[x] = y;//将x的父节点设为y
v[y] += v[x];//将两朵云彩的数据打包在一起,
c[y] += c[x];
}
/*测试数据 1 3
3 2
就是说你买了1号,就要买3号,3号买了你还要买2号
*/
for (int i = 1; i <= n; i++)
{
int x = find(i);
if (!vis[i])
{
c1[cnt] += c[x];
v1[cnt] += v[x];
vis[x] = 1;//把这个点的父节点标为已统计
cnt++;
}
}
for (int i = 1; i <= cnt; i++)
{
for (int j = w; j >= c1[i]; j--)//因为当背包的容积小于物体的体积时就没法在加了
{
dp[j] = max(dp[j], dp[j - c1[i]] + v1[i]);//参考动画视频,或者手动模拟
}
}
cout << dp[w];
return 0;
}
洛谷P1455 搭配购买
最新推荐文章于 2024-08-19 11:12:00 发布