搭配购买(DP+并查集)
来源:互联网 发布:华农c语言实验答案 编辑:程序博客网 时间:2024/05/17 23:06
P1455 搭配购买
题目概述:给定一组物品,每个物品对应一个价值和价格,而且定义关系G(U,V)对于一对物品ui,vi,有买ui就必须买vi的要求,同理,如果买vi就必须买ui。试求在自己的支付能力下,可以获得的最大价值。
数据规模:n<=10000,0<=m<=5000,w<=10000
输入格式:第1行,物品数N,关系数M,最大支付能力(背包规模)K。
接下来的N行,每一行都有两个数,分别表示价格PRICE和价值VALUE。
接下来的M行,每一行也是两个数,表示标号分别为U,V的物品存在关系G(U,V),关系解释见题述。
输出格式:一个int型正整数,表示自己的支付能力下,可以获得的最大价值ANS。
思路:
这个题比较显然的一个做法就是并查集+DP,经典的并查集和经典的背包DP,不过为了减少时间,我们要提前预处理一下,首先我们要知道并查集一轮处理完之后,它的FA[]数组并不是真正的根节点数组,因为缩边的时候并不是真正的根节点,对于这样的一个伪根节点数组要进行下一步处理,用一个最差情况为O(N^2)的时间来重新运行一遍findd(i)操作,这样就可以大幅减少时间,这样在运算的时候就只需要直接调用FA[]即可(话说这个小技巧在学的时候就看出来了,但是感觉对于小规模数据有点耗时间)。
代码:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int i,j,m,n,w,temp;int c[10001],d[10001];int fa[10001],b[10001];int u[10001],v[10001];int f[10001];int r(){ int ans=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { ans*=10; ans+=ch-'0'; ch=getchar(); } return ans*f;}int findd(int x){ if(fa[x]==x) return x; fa[x]=findd(fa[x]); return fa[x];}void unionn(int x,int y){ int fx=findd(x),fy=findd(y); if(fx==fy) return; fa[fx]=fy;}int main(){ n=r(),m=r(),w=r(); for(i=1;i<=n;i++) { c[i]=r(),d[i]=r(),fa[i]=i; } int x,y; for(i=1;i<=m;i++) { x=r(),y=r(); unionn(x,y); } for(i=1;i<=n;i++) findd(i); for(i=1;i<=n;i++) { if(!b[i]) { ++temp; //int f1=findd(i); for(j=1;j<=n;j++) { // if(findd(j)==f1&&!b[j]) if(fa[j]==fa[i]&&!b[j]) b[j]=1,u[temp]+=c[j],v[temp]+=d[j]; } } } for(i=1;i<=temp;i++) for(int vv=w;vv>=u[i];vv--) { f[vv]=max(f[vv],f[vv-u[i]]+v[i]); } printf("%d",f[w]); return 0;}
阅读全文
1 0
- 搭配购买(DP+并查集)
- 搭配购买(dp+并查集优化)
- 搭配购买(01背包+并查集)
- 洛谷1455 搭配购买(并查集)
- 洛谷P1455 搭配购买(tarjan+dp)
- 搭配购买
- 并查集练习---poj 1417 并查集+DP
- poj 3728(LCA+并查集+DP)
- True Liars (并查集+dp,待续、、)
- poj 1417 True Liars (并查集+dp)
- POJ 1417 True Liars(并查集+DP)
- poj1417 true liars(并查集 + DP)详解
- Codeforces 455C Civilization(并查集+树形dp)
- BZOJ 1040 骑士 (并查集 树形dp)
- 分组背包dp+并查集 vijos1250
- hdu4313 贪心并查集 || 树形dp
- poj 1417(并查集+简单dp)
- 【codevs3372】选学霸,并查集+可达性DP
- spring inaction 视图
- 移动APP vs. 移动网站,哪一个更好?
- javascrip练习——显示当前时间
- 线段树模板
- 腾讯前端十天小白训练营<DAY 3>---css引入方式、选择器&权重
- 搭配购买(DP+并查集)
- 关于table设置百分比单位无法实现响应式的问题---强制換行
- linux平台下防火墙iptables原理(转)
- 关于dos命令行方式的一些解释
- 廖雪峰python学习记录
- Oracle 性能报告ADDM
- UVA 11178
- 进窝查看下!
- L