很简单但是繁杂的一道题
2024-11-24 20:16:53
发布于:广东
13阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
int n,m,W,fa[10001],dp[10001],w[10001],v[10001],cnt,neww[10001],newv[10001];
int find(int x){
return fa[x]=x==fa[x]?x:find(fa[x]);
}
int main(){
cin>>n>>m>>W;
for(int i=1;i<=n;++i)
scanf("%d%d",&w[i],&v[i]);
for(int i=1;i<=n;++i)fa[i]=i;
for(int i=1;i<=m;++i){
int x,y;
scanf("%d%d",&x,&y);
int xx=find(x),yy=find(y);
fa[xx]=yy;
}
for(int i=1;i<=n;++i){
int tmp=find(i);
if(tmp==i){
neww[i]+=w[i];
newv[i]+=v[i];
}
else{
neww[tmp]+=w[i];
newv[tmp]+=v[i];
}
}
memset(w,0,sizeof(w));
memset(v,0,sizeof(v));
for(int i=1;i<=n;++i){
if(neww[i]!=0&&newv[i]!=0){
w[++cnt]=neww[i];
v[cnt]=newv[i];
}
}
for(int i=1;i<=cnt;++i)
for(int j=W;j>=w[i];--j)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
cout<<dp[W];
return 0;
}
这里空空如也
有帮助,赞一个