1 条题解

  • 0
    @ 2023-4-15 15:36:03

    并查集 + 01背包

    #include <bits/stdc++.h>
    #define int long long int
    using namespace std;
    
    const int N = 2e5 + 7;
    int n,m,w;
    int fa[N << 1],val[N],weight[N];
    int bagv[N],bagw[N],f[N];
    vector<int> e[N];
    
    inline int read(){
    	int x = 0,f = 1;
    	char c = getchar();
    	for(;!isdigit(c);c = getchar())
    		if(c == '-')f = -1;
    	for(;isdigit(c);c = getchar())
    		x = (x << 1) + (x << 3) + c - '0';
    	return x * f;
    }
    
    int get(int x){
    	if(fa[x] == x)return x;
    	return fa[x] = get(fa[x]);
    }
    
    void merge(int x,int y){
    	x = get(x);
    	y = get(y);
    	if(x != y){
    		fa[x] = y;
    		val[y] += val[x];
    		weight[y] += weight[x];
    	}
    }
    
    signed main(){
    	n = read(),m = read(),w = read();
    	
    	for(int i = 1;i <= n;i ++){
    		fa[i] = i;
    		weight[i] = read();
    		val[i] = read();
    	}
    	
    	for(int i = 1;i <= m;i ++){
    		int x = read(),y = read();
    		merge(x,y);
    	}
    	
    	int cnt = 0;
    	for(int i = 1;i <= n;i ++){
    		if(fa[i] == i){
    			bagw[++ cnt] = weight[i];
    			bagv[cnt] = val[i];
    		}
    	}
    	
    	for(int i = 1;i <= cnt;i ++){
    		for(int k = w;k >= bagw[i];k --){
    			f[k] = max(f[k],f[k - bagw[i]] + bagv[i]);
    		}
    	}
    	
    	printf("%lld",f[w]);
    	
    	return 0;
    }
    

    信息

    ID
    397
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    8
    已通过
    3
    上传者