bzoj 1821: [JSOI2010]Group 部落划分 Group Kruskal
2017-09-05 22:21
447 查看
题意
给出平面上n个点,要求把这n个点划分成k个集合,使得最近的两个不同集合的点最远。n<=1000
分析
唉无聊刷道水题玩玩。把n*(n-1)/2条边排序后从小到大加,加到不能加的那条边的长度即为答案。
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N=1005; int n,m,x ,y ,f ,cnt; struct edge{int x,y,dis;}e[N*N]; bool cmp(edge a,edge b) { return a.dis<b.dis; } int find(int x) { if (f[x]==x) return x; else return f[x]=find(f[x]); } int main() { scanf("%d%d",&n,&m); 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++) e[++cnt].x=i,e[cnt].y=j,e[cnt].dis=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); sort(e+1,e+cnt+1,cmp); int s=n; for (int i=1;i<=n;i++) f[i]=i; for (int i=1;i<=cnt;i++) { int x=find(e[i].x),y=find(e[i].y); if (x==y) continue; else if (s==m) { printf("%.2lf",sqrt(e[i].dis)); return 0; } else f[x]=y,s--; } return 0; }
相关文章推荐
- BZOJ 1821 JSOI 2010 Group 部落划分 Group Kruskal
- BZOJ 1821 [JSOI2010]Group 部落划分(kruskal)
- BZOJ 1821 JSOI2010 部落划分 Group Kruskal
- 【最小生成树+贪心】BZOJ1821: [JSOI2010]Group 部落划分 Group
- [JSOI2010][BZOJ1821]Group 部落划分 Group
- BZOJ 1821 [JSOI2010]Group 部落划分 Group 题解与分析
- bzoj1821 [JSOI2010]Group 部落划分 Group
- [二分+并查集] BZOJ1821 : [JSOI2010]Group 部落划分 Group
- bzoj1821 [JSOI2010]Group 部落划分 Group
- [BZOJ1821]JSOI2010部落划分|贪心|Kruskal
- 【BZOJ 1821】 [JSOI2010]Group 部落划分 Group
- bzoj 1821: [JSOI2010]Group 部落划分 Group(并查集)
- BZOJ 1821 JSOI2010 部落划分 Group prim
- 【bzoj1821】[JSOI2010]Group 部落划分 Group
- BZOJ 1821: [JSOI2010]Group 部落划分 Group
- bzoj1821: [JSOI2010]Group 部落划分 Group
- BZOJ_[JSOI2010]Group 部落划分 Group_kruskal
- BZOJ1821 [JSOI2010]Group 部落划分 贪心+并查集
- 【bzoj 1821】 [JSOI2010]Group 部落划分 Group
- bzoj 1821: [JSOI2010]Group 部落划分