zoukankan      html  css  js  c++  java
  • Codeforces 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses

    【题目链接】 http://codeforces.com/problemset/problem/741/B

    【题目大意】

      给出一张图,所有连通块构成分组,每个点有价值和代价,
      要么选择整个连通块,要么只能在连通块中选择一个,或者不选,为最大价值

    【题解】

      首先我们用并查集求出连通块,然后对连通块进行分组背包即可。

    【代码】

    #include <cstdio>
    #include <vector>
    #include <algorithm>
    #include <cstring>
    #define rep(i,n) for(int i=1;i<=n;i++)
    using namespace std;
    const int N=1010;
    int dp[N],f[N],n,m,x,y,size,w[N],b[N];
    vector<int> v[N];
    int sf(int x){return f[x]==x?x:f[x]=sf(f[x]);}
    int main(){  
        while(~scanf("%d%d%d",&n,&m,&size)){  
            rep(i,n)f[i]=i,v[i].clear();
            rep(i,n)scanf("%d
    ",&w[i]);  
            rep(i,n)scanf("%d
    ",&b[i]);
            rep(i,m){scanf("%d%d",&x,&y);f[sf(x)]=sf(y);}  
            rep(i,n)v[sf(i)].push_back(i);  
            memset(dp,0,sizeof(dp));  
            rep(i,n)if(sf(i)==i){  
                for(int j=size;j>=0;j--){  
                    int W=0,B=0;  
                    for(int k=0;k<v[i].size();k++){  
                        W+=w[v[i][k]]; B+=b[v[i][k]];  
                        if(j>=w[v[i][k]])dp[j]=max(dp[j],dp[j-w[v[i][k]]]+b[v[i][k]]);  
                    }if(j>=W)dp[j]=max(dp[j],dp[j-W]+B);  
                }  
            }printf("%d
    ",dp[size]);  
        }return 0;  
    }   
  • 相关阅读:
    XJTUOJ13 (数论+FFT)
    ZOJ3956 ZJU2017校赛(dp)
    ZOJ3953 ZJU2017校赛(贪心)
    2014ACM/ICPC亚洲区西安站现场赛 F color(二项式反演)
    LOJ10129
    loj 10127最大数
    noip 选择客栈
    LOJ10121 与众不同
    CQOI 2006 简单题
    校门外的树
  • 原文地址:https://www.cnblogs.com/forever97/p/Codeforcess741b.html
Copyright © 2011-2022 走看看