野人部落

来源:互联网 发布:jeeplus 工作流源码 编辑:程序博客网 时间:2024/05/17 03:03

这里写图片描述
这里写图片描述
裸的K算法,枚举最小边,当两个点不在一个连通块的时候,就可以减少连通块的数量,然后直到有k个联通块时,输出下一个合法的边

#include <cstdio>#include <iostream>#include <cmath> #include <algorithm>using namespace std;double x[1010],y[1010];struct tw{    int p1;    int p2;    double dis;};tw d[1000*1000+100];int cnt;int fat[1010];bool comp(const tw&a,const tw&b){    return a.dis<b.dis;}int find(int x){    if(x==fat[x]) return x;    return fat[x]=find(fat[x]);}int main(){    int n,k;    scanf("%d%d",&n,&k);    for(int i=1;i<=n;i++)     fat[i]=i;    for(int i=1;i<=n;i++)     scanf("%lf%lf",&x[i],&y[i]);    for(int i=1;i<=n;i++)     for(int j=1;j<=n;j++)      if(i!=j) d[++cnt].dis=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])),d[cnt].p1=i,d[cnt].p2=j;    sort(d+1,d+cnt+1,comp);    int kis=n;    int now=1;    while(1)    {        if(kis==k) break;        int fx=find(d[now].p1);        int fy=find(d[now].p2);        if(fx!=fy) fat[fx]=fy,kis--;        now++;    }    while(1)    {        int fx=find(d[now].p1);        int fy=find(d[now].p2);        if(fx!=fy)         {            printf("%.2lf",d[now].dis);            break;        }        now++;    }    return 0;} 
原创粉丝点击