洛谷P1455 搭配购买
把需要一起购买的物品放到并查集里,每一个并查集的标志是根节点,把v和w都累加,然后对根节点做01背包。
#include<bits/stdc++.h> using namespace std; int dad[10001],f[10001],v[10001],bag,w[10001]; int n,m; int ans; int getfather(int x) { if(dad[x]==x) return x; dad[x]=getfather(dad[x]); return dad[x]; } int main() { cin>>n>>m>>bag; for(int i=1;i<=n;i++) dad[i]=i; for(int i=1;i<=n;i++) cin>>w[i]>>v[i]; int x,y; while(m--) { cin>>x>>y; int gx=getfather(x),gy=getfather(y); if(gx!=gy) { dad[gx]=gy; v[gy]+=v[gx]; w[gy]+=w[gx]; } } for(int i=1;i<=n;i++) { if(getfather(i)==i) for(int j=bag;j>=w[i];j--) f[j]=max(f[j],f[j-w[i]]+v[i]); } cout<<f[bag]; return 0; }
时间: 2024-10-12 02:23:28