100最后一个点MLE
  • 板块P1455 搭配购买
  • 楼主ZYH_XB
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/9/9 16:08
  • 上次更新2024/9/9 20:52:32
查看原帖
100最后一个点MLE
1209058
ZYH_XB楼主2024/9/9 16:08
#include<bits/stdc++.h>
using namespace std;
int n,m,w,edge[500005],head[500005],nxt[500005];
int c[500005],ww[500005],flag[500005];
int c1[500005],w1[500005];
int cnt,tot,ans,sum,f[500005];
void add_edge(int x,int y){
	nxt[++tot]=head[x];
	head[x]=tot;
    edge[tot]=y;
}
void dfs(int u,int fa){
	for(int i=head[u];i;i=nxt[i]){
		int v=edge[i];
		if(v==fa) continue;
		flag[v]=1;
		ans+=ww[v];
		sum+=c[v];
		dfs(v,u);
	}
}
int main(){
	ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m>>w;
    for(int i=1;i<=n;i++) cin>>c[i]>>ww[i];
    for(int i=1;i<=m;i++){
    	int x,y;
    	cin>>x>>y;
    	add_edge(x,y);
    	add_edge(y,x);
	}
	for(int i=1;i<=n;i++){
		if(!flag[i]){
			dfs(i,0);
			ans+=ww[i],sum+=c[i];
			w1[++cnt]=ans;
			c1[cnt]=sum;
		}
		ans=0,sum=0;
	}
	for(int i=1;i<=cnt;i++){
		for(int j=w;j>=c1[i];j--)
		f[j]=max(f[j],f[j-c1[i]]+w1[i]);
	}
	cout<<f[w];
	return 0;
}
2024/9/9 16:08
加载中...