[Luogu] 选学霸

Posted xayata

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Luogu] 选学霸相关的知识,希望对你有一定的参考价值。

https://www.luogu.org/problemnew/show/P2170

并查集+DP

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=20005;
int n,m,k,tot;
int p[maxn];
int man[maxn];
int f[maxn+maxn];
int find(int x) {
    return (x==p[x]?x:p[x]=find(p[x]));
}
void solve() {
    memset(f,0,sizeof(f));
    for(int i=1; i<=tot; i++)
        for(int j=2*m; j>=man[i]; j--)
            f[j]=max(f[j],f[j-man[i]]+man[i]);
    for(int i=0; i<=m; i++) {
        if(f[m-i]==m-i) {
            cout<<m-i<<endl;
            return;
        }
        if(f[m+i]==m+i) {
            cout<<m+i<<endl;
            return;
        }
    }
    return;
}
int main() {
    cin>>n>>m>>k;
    int u,v;
    for(int i=1; i<=n; i++)
        p[i]=i;
    for(int i=1; i<=k; i++) {
        cin>>u>>v;
        int x=find(u);
        int y=find(v);
        p[x]=y;
    }
    memset(man,0,sizeof(man));
    for(int i=1; i<=n; i++)
        man[find(i)]++;
    tot=0;
    for(int i=1; i<=n; i++)
        if(man[i]!=0) man[++tot]=man[i];
    solve();
    return 0;
}

 

以上是关于[Luogu] 选学霸的主要内容,如果未能解决你的问题,请参考以下文章

选学霸

洛谷P2170选学霸

600多种编程语言为何选学Python?这几个理由足够了!

学霸数据处理项目α版本代码冗余部分消除及部分代码调整过程说明

本月本周github热度霸榜项目——jeecgboot

本月本周github热度霸榜项目——jeecgboot