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;}


原创粉丝点击