MnZn求助,并查集+背包
查看原帖
MnZn求助,并查集+背包
232507
OK咯莫名其妙楼主2021/11/15 17:17
#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
int fa[maxn];
struct node{
	int v,w;
}a[maxn];
int dp[maxn];
int find(int x){
	if(fa[x]==x)return x;
	else
	return fa[x]=find(fa[x]);
}
int main(){
	int n,m,w;
	cin>>n>>m>>w;
	for(int i=1;i<=n;i++){
		cin>>a[i].v>>a[i].w;
		fa[i]=i;
	}
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		int fx=find(x);
		int fy=find(y);
		if(fx==fy)continue;
		else
		{
			fa[fy]=fx;
			a[fx].v+=a[y].v;
			a[fx].w+=a[y].w;
			a[x].v=0;
			a[x].w=0;
			a[y].v=0;
			a[y].w=0;
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=w;j>=a[i].v;j--){
			dp[j]=max(dp[j],dp[j-a[i].v]+a[i].w);
		}
	}
	int ans=-1;
	for(int i=1;i<=w;i++)
		ans=max(ans,dp[i]);
	cout<<ans<<endl;
	return 0;
}
2021/11/15 17:17
加载中...