为什么有一个点过不了啊啊啊我写了一个小时啊啊啊
查看原帖
为什么有一个点过不了啊啊啊我写了一个小时啊啊啊
735141
hiGh_sPeEd楼主2023/12/24 12:25
#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int p[N],n,m,w,jq[N],jz[N],dp[N];
int find(int x){
	if(p[x]!=x){
		int root=find(p[x]);
		p[x]=root;
	}
	return p[x];
}
int main(){
	for(int i=1;i<=N;i++){
		p[i]=i;
	}
	cin>>n>>m>>w;
	for(int i=1;i<=n;i++){
		cin>>jq[i]>>jz[i];
	}
	while(m--){
		int a,b;
		cin>>a>>b;
		int pa=find(a),pb=find(b);
		if(pa!=pb){
			p[pa]=p[pb];
			jq[b]+=jq[a];
			jz[b]+=jz[a];
		}
	}
	//背包怎么写啊啊啊啊啊啊啊啊啊 
	for(int i=1;i<=n;i++){
		if(p[i]==i){
			for(int j=w;j>=jq[i];j--){
				dp[j]=max(dp[j],dp[j-jq[i]]+jz[i]);
			}
		} 
	}
	cout<<dp[w];
	return 0;
}

真的很好懂(并查集加上动态规划) 帮助我的神牜下面长10厘米(●ˇ∀ˇ●)

2023/12/24 12:25
加载中...