问题 B: 小鱼的搭配购物
时间限制: 1 Sec 内存限制: 128 MB

[提交][状态][讨论版]
题目描述
小鱼最近特别喜欢口红,决定去选口红,商店里有n支口红,口红被编号为1,2,……n,并且每支口红都有一个价值。但是商店老板跟她说,一些口红要搭配来买才好,所以买一支口红则与这支口红有搭配的口红都要买,但是小鱼的钱有限,所以她希望买的价值越多越好。

输入
第1行n,m,w表示n支口红,m个搭配,小鱼有w的钱。

第2至n+1行,每行ci,di表示 i 支口红的价钱和价值。

第n+2至n+1+m行,每行 ui、vi 表示买 ui 必须买 vi,同理,如果买 vi 就必须买 ui。

输出
一行,表示可以获得的最大价值。
样例输入

5 3 10
3 10
3 10
3 10
5 100
10 1
1 3
3 2
4 2

样例输出

1

提示

数据范围:

30%的数据满足:n<=100;

50%的数据满足:n<=1000; m<=100; w<=10000;

100%的数据满足:n<=10000; 0<=m<=5000; w<=10000;

/*
训练的时候总错在省事,
合并集合写成下面那份代码的样子,
然后处理数据的时候没有重新查root
因为我一直以为我合并集合的写法会把同一个集合里的元素全部直接指向root,
实际上我下面的写法是做不到的,只是部分直接指向了root。。。
吸取教训!!!
*/

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e4+5;
struct Node
{LL w;LL v;
} a[N];
Node sum[N];
LL pre[N],cnt[N];
LL dp[N];
LL myFind(LL x)
{return pre[x]==x?x:myFind(pre[x]);
}
LL myUnion(LL x,LL y)
{LL fx = myFind(x);LL fy = myFind(y);if(fx != fy){if(cnt[fx] >= cnt[fy]){pre[fy] = fx;cnt[fx]+=cnt[fy];}else{pre[fx] = fy;cnt[fy] += cnt[fx];}}
}
int main()
{LL n,m,W;scanf("%lld%lld%lld",&n,&m,&W);for(LL i = 1; i <= n; i++){scanf("%lld%lld",&a[i].w,&a[i].v);}for(LL i = 1; i <= n; i++){pre[i] = i;cnt[i] = 1;}LL x,y;for(LL i = 1; i <= m; i++){scanf("%lld%lld",&x,&y);myUnion(x,y);}for(LL i = 1; i <= n; i++){//错误点:这里必须要再查一次root!!!!!sum[pre[i]].w += a[i].w;sum[pre[i]].v += a[i].v;}LL k = 0;for(LL i = 1; i <= n; i++){if(sum[i].v){cnt[++k] = i;}}// cout<<k<<endl;for(LL i = 1; i <= k ; i++){LL t = cnt[i];//cout<<sum[t].w<<" "<<sum[t].v<<endl;for(LL j = W; j >= sum[t].w;  j--){dp[j] = max(dp[j],dp[j-sum[t].w]+sum[t].v);}}printf("%lld\n",dp[W]);return 0;
}

Ac_code:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e4+5;
struct Node
{LL w;LL v;
} a[N];
Node sum[N];
LL pre[N],cnt[N];
LL dp[N];
LL myFind(LL x)
{return pre[x]==x?x:myFind(pre[x]);
}
void myUnion(LL x,LL y)
{LL fx = myFind(x);LL fy = myFind(y);if(fx != fy){pre[fx] = fy;}
}
int main()
{LL n,m,W;scanf("%lld%lld%lld",&n,&m,&W);for(LL i = 1; i <= n; i++){scanf("%lld%lld",&a[i].w,&a[i].v);}for(LL i = 1; i <= n; i++){pre[i] = i;cnt[i] = 1;}LL x,y;for(LL i = 1; i <= m; i++){scanf("%lld%lld",&x,&y);myUnion(x,y);}for(LL i = 1; i <= n; i++){int now = myFind(pre[i]); //这里必须查一下,因为有部分pre[i]还不是它们的root的编号sum[now].w += a[i].w;sum[now].v += a[i].v;}LL k = 0;for(LL i = 1; i <= n; i++){//cout<<pre[i]<<" ";if(sum[i].v){cnt[++k] = i;}}for(LL i = 1; i <= k ; i++){LL t = cnt[i];for(LL j = W; j >= sum[t].w;  j--){dp[j] = max(dp[j],dp[j-sum[t].w]+sum[t].v);}}printf("%lld\n",dp[W]);return 0;
}

问题 B: 小鱼的搭配购物(并查集+01背包)相关推荐

  1. 【Codeforces 741 B. Arpa's weak amphitheater and Mehrdad's 】+ 并查集 + 01背包

    B. Arpa's weak amphitheater and Mehrdad's valuable Hoses time limit per test 1 second memory limit p ...

  2. POJ1417 True Liars ——种类并查集+01背包+路径** 好题

    ​​​​​​POJ1417 题意: 有n行输入形如x, y, str,str为yes表示x说y是天使,str为no表示x说y不是天使(x, y为天使,恶魔的编号,1<=x,y<=p+q): ...

  3. codeforce 742 D (并查集+分组背包)

    题目:http://codeforces.com/problemset/problem/742/D 题意:若干人和关系,限定容量,每次能取一个联通块中的一个或全部,求取得的最大值. 思路:并查集处理玩 ...

  4. 树形结构 —— 并查集

    [概述] 并查集(Union-Find Set)是一种用于分离集合操作的抽象数据类型,其处理的是集合(set)之间的关系,一般处理的是图的连通分量,当给出两个的元素的一个无序对 (a,b) 时,需要快 ...

  5. 【高级数据结构】并查集

    目录 A.AcWing 1250. 格子游戏 B.AcWing 1252. 搭配购买 C.AcWing 237. 程序自动分析 D.AcWing 239. 奇偶游戏 E.AcWing 238. 银河英 ...

  6. P1455-搭配购买【图论,并查集,dp,背包】

    正题 题目链接: https://www.luogu.org/problemnew/show/P1455 大意 有n个商品,给出价值和价格.有m组搭配,如果买了其中一个就得买另一个,给出你拥有的钱,求 ...

  7. C++并查集算法(详细)

    C++并查集算法 什么是并查集? 并查集写法 详解 例题:洛谷 P3367.[模板]并查集 题意 代码 什么是并查集? 当我们在做图论题目的时候 经常会读到一些长这样的题目描述: -连接 a , b ...

  8. [数据结构、读书笔记、C++] 并查集详解

    介绍 并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的 合并及查询 问题. 其主要操作为: Union(合并) :将两个节点所在集合合并为一个集合 Find (查询) ...

  9. 2022.1.18(一测补题,树的遍历题目,并查集)

    由于深夜点了外卖要1:50才到 闲着没事就补一下题目! 题目如下: 题目描述 In one one-dimensional world there are nn platforms. Platform ...

最新文章

  1. 独家 | 几个Jupyter笔记本的使用技巧
  2. 【灌水】一些奇妙的图片(持续更新)
  3. vue.js接收并下载文件流(blob对象)
  4. python基础学习语法和函数
  5. 几何画板200个经典课件_几何画板Sketchpad Mac(数学教学软件)中文版
  6. 2020年,产品经理如何提高求职成功率?
  7. boost::gil::for_each_pixel用法的测试程序
  8. LoadRunner11支持的浏览器小结
  9. SpringCloudConfig配置中心读取本地配置文件
  10. 区块链100讲:带你走进EOS的存储系统
  11. 切换账号_在iOS 13在如何切换App Store账号
  12. linux du命令参数及用法详解---linux统计磁盘空间大小命令
  13. 【细胞分割】基于matlab GUI生物细胞计数【含Matlab源码 758期】
  14. HashSet、TreeSet、LinkedHashSet的区别
  15. Unity3D脚本学习1
  16. 简化sqp唯一数据的逻辑
  17. PHP实现opentracing链路追踪
  18. 【数字信号处理】线性常系数差分方程 ( 使用递推解法求解 “ 线性常系数差分方程 “ | “ 线性常系数差分方程 “ 初始条件的重要性 )
  19. 202020 公文系统安装技巧
  20. html引起qq加好友,QQ被限制加好友怎么办如何避免加好友限制

热门文章

  1. proxy connect abort处理方法_Vue 3.0 初探 - Proxy
  2. Linux常用命令:FireWall
  3. 从零开始学习docker(八)多台机器通信
  4. linux下常见的网络相关命令
  5. Python 的 51 个秘密曝光,Github 获 2 万星
  6. 州 选择国家_青海的三大城市:海南州、海北州和海西州,谁的风景更美?
  7. Queue)) 类,msdn上的一篇文章,便于查看
  8. MVC架构简介及其测试策略
  9. 推荐阅读《赢在下班后》
  10. 一道小时候经常玩的数字游戏