救,捞,关
查看原帖
救,捞,关
1048440
封禁用户楼主2023/8/18 16:13

WA了最后两个点,蒟蒻发现大家都是用并查集做的,但是蒟蒻用的是缩点的思想,有没有大佬知道蒟蒻错哪里了改了3个小时了悲

#include<bits/stdc++.h>
using namespace std;
struct Point{int u,v;}e[5005];
struct Edge{int v,next;}edge[5005];
int c[10005],d[10005],n,m,w;
int val[10005],worth[10005];
int fa[10005],cnt,head[5005],ce;
inline void adde(int u,int v){
	edge[++ce].v=v;
	edge[ce].next=head[u];
	head[u]=ce;
}
int vis[5005],vist[5005];
inline void init(int u,int pos){
	vis[u]=1;
	val[pos]+=d[u],worth[pos]+=c[u];
	for(int i=head[u];i;i=edge[i].next){
		int v=edge[i].v;
		if(!vis[v]){vis[v]=vist[v]=1;init(v,pos);}
	}
}
int dp[100005];
signed main(){
	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<=m;i++) scanf("%d%d",&e[i].u,&e[i].v);
	for(int i=1;i<=m;i++) 
		adde(e[i].u,e[i].v),adde(e[i].v,e[i].u);
	for(int i=1;i<=n;i++){
		if(vist[i]) continue;
		init(i,++cnt);
	}
	for(int i=0;i<=cnt;i++){
		for(int j=w;j>=worth[i];j--){
			dp[j]=max(dp[j],dp[j-worth[i]]+val[i]);
		}
	}
	int ans=0;
	for(int i=1;i<=w;i++) ans=max(ans,dp[i]);
	printf("%d",ans);
	return 0;
}

2023/8/18 16:13
加载中...