codeforces 741B
来源:互联网 发布:摇号的软件 编辑:程序博客网 时间:2024/05/17 02:56
题目大意:
有n个人,每个人都有对应的value值和weight值, 并且每个人都有自己的朋友圈,这个朋友圈的人要不全部参加party,否则至多只有一个人可以参加;
题目分析:
分组背包,顺带处理所有人都参加的情况;
一个朋友圈就是一个分组,使用并查集可以很简单的完成分组的过程
代码如下:
#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<cstdio>#include<cmath>#include<vector>#define N 1005#define M 1000005using namespace std;int a[N],b[N],w[N],f[M];int find(int x){if (x==a[x]) return x;else return a[x]=find(a[x]);}void make(int x,int y){a[find(x)]=find(y);}int main(){int n,m,W,x,y;scanf("%d%d%d",&n,&m,&W);for (int i=1;i<=n;i++) scanf("%d",&w[i]);for (int i=1;i<=n;i++) scanf("%d",&b[i]);for (int i=1;i<=n;i++) a[i]=i;for (int i=1;i<=m;i++){scanf("%d%d",&x,&y);make(x,y);}vector<int>G[N];for (int i=1;i<=n;i++) G[find(i)].push_back(i);for (int i=1;i<=n;i++){if (find(i)!=i) continue;for (int j=W;j>=0;j--){int sum1=0,sum2=0;for (int k=0;k<G[i].size();k++){sum1+=w[G[i][k]]; sum2+=b[G[i][k]]; if(j>=w[G[i][k]]) f[j]=max(f[j],f[j-w[G[i][k]]]+b[G[i][k]]);}if (j>=sum1) f[j]=max(f[j],f[j-sum1]+sum2);}}printf("%d",f[W]);return 0;}
阅读全文
0 0
- codeforces 741B
- codeforces 741B
- codeforces B
- codeforces B
- codeforces B
- codeforces B
- Codeforces 741B 并查集+dp
- CodeForces 626B CodeForces 626B【暴力】
- CodeForces 841B (B) 博弈
- codeforces 134B
- codeforces#98 b
- codeforces 105 div2 B
- Codeforces 166B - Polygons
- codeforces B. Coins
- codeforces----193B Xor
- codeforces----208B Solitaire
- Codeforces 1B - Spreadsheet
- codeforces 214B Hometask
- .Net委托类型解析
- java怎样调用动态内部类
- Java+大数据开发——Hadoop集群环境搭建(一)
- hdu6165 FFF at Valentine【强联通缩点+拓扑排序】
- 图的基本存储的基本方式二
- codeforces 741B
- freemarker解决数字小数点格式化问题
- 5.IDA-文本搜索、二进制搜索(16进制字节序列)、替换16进制
- APM Server端Java探针调研
- 2017年8月22日训练日记
- SpringMVC+MyBatis+POI导入Excel
- cogs526 爱争吵的猴子
- 7.IDA-创建结构体
- 二分图最大匹配(邻接表法)