CodeForces

来源:互联网 发布:淘宝卖衣服需要什么证 编辑:程序博客网 时间:2024/06/13 21:20

点击打开链接


裸地分组背包,用并查集维护分组,并把该组的和也加进去就好了,就当贴个模板了

#include<bits/stdc++.h>#define mk make_pair #define pb push_back using namespace std;typedef long long ll;const int mod=1e9+7;const int maxn=1e3+5;ll dp[maxn];ll w[maxn],b[maxn];ll sw[maxn],sb[maxn];vector<pair<ll,ll > >vt[maxn];int n,m,ww;int pre[maxn];void init(){for(int i = 0;i < maxn;++i){vt[i].clear();dp[i] = 0;pre[i] = i;sw[i] = 0;sb[i] = 0;}}int find(int x){return x == pre[x] ? x : pre[x] = find(pre[x]);}void join(int x,int y){int f1 =find(x),f2=find(y);if(f1 != f2){pre[f1] = f2; }return;}int main(){while(~scanf("%d %d %d",&n,&m,&ww)){init();for(int i = 1;i <= n;++i)scanf("%lld",&w[i]);for(int i = 1;i <= n;++i)scanf("%lld",&b[i]);int x,y;for(int i = 1;i <= m;++i){scanf("%d %d",&x,&y);join(x,y);}for(int i = 1;i <= n;++i){int x = find(i);vt[x].pb(mk(w[i],b[i]));sw[x] += w[i];sb[x] += b[i];}for(int i = 1;i <= n;++i){if(vt[i].size() == 0) continue;vt[i].pb(mk(sw[i],sb[i]));}for(int i = 1;i <= n;++i){if(vt[i].size() == 0) continue;for(int j = ww;j >= 0;--j)//v在外保证容斥{for(int k = 0;k < (int)vt[i].size();++k){int W = vt[i][k].first;int B = vt[i][k].second;if(j - W >= 0)dp[j] = max(dp[j],dp[j-W]+B);}}}printf("%lld\n",dp[ww]);}return 0;}


原创粉丝点击