简单01背包求调!
查看原帖
简单01背包求调!
873417
Istruggle楼主2023/1/12 09:21

第#2 #3 #4 个点没过去

#include<bits/stdc++.h>
using namespace std;
int fa[10005];
int find(int x)
{
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
int main()
{
	int n,m,w,c[10005],d[10005],dp[100005];
	scanf("%d%d%d",&n,&m,&w); 
	for(int i = 1;i<=n;i++)
	scanf("%d%d",&c[i],&d[i]);
	for(int i = 1;i<=n;i++) fa[i]=i;
	for(int i = 1;i<=m;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		int fu=find(u);
		int fv=find(v);
		fa[u]=v;
	}
	for(int i = 1;i<=n;i++)
	{
		if(fa[i]!=i)
		{
			int f=find(i);
			d[f]+=d[i]; d[i]=0;
			c[f]+=c[i]; c[i]=0;
		}
	}
	for(int i = 1;i <= n;i++)
	for(int j= w;j>=c[i];j--)
	{
		dp[j]=max(dp[j],dp[j-c[i]]+d[i]);
	}
	printf("%d",dp[w]);
}
2023/1/12 09:21
加载中...