[HAOI2006] 聪明的猴子 - Kruskal

Posted mollnn

tags:

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

求给定的一组数中,不小于点集生成树中最长边距的有多少个。

Solution

裸题。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2005;
struct edge {
    int u,v;
    double w;
    bool operator < (const edge &b) {
        return w<b.w;
    }
} e[N*N];

int n,m,x[N],y[N],fa[N],a[N];
int find(int p) {
    return fa[p]==p?p:fa[p]=find(fa[p]);
}
void merge(int p,int q) {
    p=find(p);
    q=find(q);
    if(p-q) fa[p]=q;
}

signed main() {
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    cin>>m;
    for(int i=1;i<=m;i++) cin>>x[i]>>y[i];
    int ind=0;
    for(int i=1;i<=m;i++) {
        for(int j=1;j<i;j++) {
            e[++ind]=(edge){i,j,sqrt((x[i]-x[j])*(x[i]-x[j])+
                        (y[i]-y[j])*(y[i]-y[j]))};
        }
    }
    sort(e+1,e+ind+1);
    double tmp = 0;
    for(int i=1;i<=m;i++) fa[i]=i;
    for(int i=1;i<=ind;i++) {
        if(find(e[i].u)!=find(e[i].v)) {
            merge(e[i].u,e[i].v);
            tmp=max(tmp,e[i].w);
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++) if(a[i]>=tmp) ++ans;
    cout<<ans;
}

以上是关于[HAOI2006] 聪明的猴子 - Kruskal的主要内容,如果未能解决你的问题,请参考以下文章

[HAOI2006]聪明的猴子

[HAOI2006] 聪明的猴子

BZOJ2429[HAOI2006]聪明的猴子[最小生成树 kruskal]

BZOJ 2429: [HAOI2006]聪明的猴子

[HAOI2006] 聪明的猴子 - Kruskal

bzoj2429: [HAOI2006]聪明的猴子