题解 | #B-经商#

B-经商

https://ac.nowcoder.com/acm/problem/14545

思路

01 背包 + 并查集

Code

#include <bits/stdc++.h>

using namespace std;

const int N = 10010;

int p[N];
int fa[N];
int f[N],v[N],w[N];
int n,m,c;

int find(int x){
    if(x==fa[x]) return x;
    return fa[x]=find(fa[x]);
}

int main(){
    int T;
    cin>>T;

    while(T--){
        cin>>n>>m>>c;
        for(int i=2;i<=n;i++) cin>>v[i]>>w[i];

        for(int i=1;i<=n;i++) fa[i]=i;
        while(m--){
            int a,b;
            cin>>a>>b;
            a=find(a),b=find(b);
            if(a!=b) fa[a]=b;
        }
        int t=0;
        for(int i=2;i<=n;i++)  if(find(i)==find(1)) p[++t]=i; 
        for(int i=1;i<=t;i++) {
            int pos=p[i];
            for(int j=c;j>=v[pos];j--)   f[j]=max(f[j],f[j-v[pos]]+w[pos]);
        }
        cout<<f[c]<<endl;
        memset(f,0,sizeof f);
    }

    return 0;
}
全部评论

相关推荐

10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
三年之期已到我的offer快到碗里来:9硕都比不上9本
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务