听灌多
  • 板块灌水区
  • 楼主again_q
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/15 16:33
  • 上次更新2024/7/15 17:21:06
查看原帖
听灌多
723168
again_q楼主2024/7/15 16:33

玄关

P1455

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dp[110000],f[110000],n,m,w,w1[110000],v[110000],sum[110000],sum1[110000];
int find(int x){
    if(f[x]==x)return x;
    return f[x]=find(f[x]);
}
int main(){
    cin>>n>>m>>w;
    for(int i=1;i<=n;i++){
        f[i]=i;
    }
    for(int i=1;i<=n;i++){
        cin>>w1[i]>>v[i];
        sum[i]=w1[i];
        sum1[i]=v[i];
    }
    for(int i=1,x,y;i<=m;i++){
        cin>>x>>y;
        x=find(x);
        y=find(y);
        if(x!=y){
            f[x]=y;
            sum[y]+=sum[x];
            sum1[y]+=sum1[x];
        }
    }
    for(int i=1;i<=n;i++){
        int x=find(i);
        for(int j=w;j>=w1[x];j--){
           if(j-sum[x]>=0) dp[j]=max(dp[j],dp[j-sum[x]]+sum1[x]);
           else continue;
        }
    }
    cout<<dp[w];
    return 0;
}

90分求调

2024/7/15 16:33
加载中...