BZOJ 1821 部落划分

Posted on 2016-06-03 11:34  ziliuziliu  阅读(162)  评论(0编辑  收藏  举报

kruskal.第k-1大的边。

其实prim会更快。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxv 1050
#define maxe 1005000
using namespace std; 
struct edge
{
    int u,v,w;
}e[maxe];
int n,k,tot=0,w[maxv],x[maxv],y[maxv],father[maxv],cnt=0;
bool cmp(edge x,edge y)
{
    return x.w<y.w;
}
void addedge(int u,int v)
{
    e[++tot].u=u;
    e[tot].v=v;
    e[tot].w=(x[u]-x[v])*(x[u]-x[v])+(y[u]-y[v])*(y[u]-y[v]);
}
int getfather(int x)
{
    if (x!=father[x])
        father[x]=getfather(father[x]);
    return father[x];
}
void kruskal()
{
    sort(e+1,e+tot+1,cmp);
    for (int i=1;i<=n;i++) father[i]=i;
    for (int i=1;i<=tot;i++)
    {
        int f1,f2;
        f1=getfather(e[i].u);f2=getfather(e[i].v);
        if (f1!=f2)
        {
            father[f1]=f2;
            w[++cnt]=e[i].w;
        }
        if (cnt==n-1) break;
    }
}
int main()
{
    scanf("%d%d",&n,&k);
    for (int i=1;i<=n;i++)
        scanf("%d%d",&x[i],&y[i]);
    for (int i=1;i<=n;i++)
        for (int j=i+1;j<=n;j++)
            addedge(i,j);
    kruskal();
    sort(w+1,w+cnt+1);
    printf("%.2lf\n",sqrt(w[n-k+1]));
    return 0;
}