啊?
查看原帖
啊?
765713
pengzhining楼主2025/1/21 08:54
#include<bits/stdc++.h>
using namespace std;
int n,m,w;
int c[10100],d[10100],b[101000];
int f[100000];
int h;
int find(int x){
    if(b[x]==x) return x;
    else return b[x]=find(b[x]);
}
int main(){
    freopen("P1455_6.in","r",stdin);
    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++){
        b[i]=i;
    }
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        if(find(x)==find(y)) continue;
        b[find(x)]=find(y);
    }
    for(int i=1;i<=n;i++){
        if(b[find(i)]!=i){
            d[find(i)]+=d[i];
            d[i]=0;
            c[find(i)]+=c[i];
            c[i]=0;
        }
    }
    for(int i=1;i<=n;i++){
        if(b[find(i)]!=i) continue;
        for(int j=w;j>=c[i];j--){
            f[j]=max(f[j],f[j-c[i]]+d[i]);
        }
    }
    cout<<f[w];
}

然鹅

2025/1/21 08:54
加载中...