您的位置:首页 > 其它

codeforces 741B

2017-08-22 21:24 211 查看
题目大意:

    有n个人,每个人都有对应的value值和weight值, 并且每个人都有自己的朋友圈,这个朋友圈的人要不全部参加party,否则至多只有一个人可以参加;

题目分析:

    分组背包,顺带处理所有人都参加的情况; 

     一个朋友圈就是一个分组,使用并查集可以很简单的完成分组的过程

代码如下:

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#define N 1005
#define M 1000005
using namespace std;
int a
,b
,w
,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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces