【BZOJ1821】【JSOI2010】Group 部落划分 Group (两个group什么意思
来源:互联网 发布:29周胎儿发育标准数据 编辑:程序博客网 时间:2024/04/29 06:39
首先我们可以考虑到二分答案+贪心。
每次check把一切边权小于mid的点对合并到一个并查集里面。
然后分析这个的正确性,发现每当mid变大,那么部落数就会减少,而且是单调的。
但是有了这个作为基础。
我们就可以延展到迭代的思想上,,然后……
然后考虑到如果各为部落,那么答案一定是所有的边中最小的边,
而此时我们如果要合并某些部落,就会导致一些边被删除
(注意:合并两个部落,那么被删除的边不一定只有这俩部落的连边,,这个太水了,不细说)
此时答案,又是所有边中最小的边。
那么显然——答案一定在最小生成树中。
这个自己脑补一下很快就出来了。
所以我们可以建立一颗最小生成树,然后记录树边,然后O(1)就可以出解了。
现在分析这个O(1)是怎么个O(1)!
有n个人,m个部落,那么原来的最小生成树n-1条边,新的最小生成树m-1条边,也就是删除了n-m条边
所以最小生成树的第n-m+1条边就是答案。
代码:
#include <cmath>#include <cstdio>#include <cstring>#include <algorithm>#define N 1050#define inf 0x3f3f3f3fusing namespace std;int n,m,x[N],y[N],cnt;struct ROAD{int u,v,len;bool operator < (const ROAD &a)const{return len<a.len;}ROAD(int _u,int _v,int _len):u(_u),v(_v),len(_len){}ROAD(){}}road[N*N];int f[N],id;int find(int x){if(f[x]==x)return x;return f[x]=find(f[x]);}int main(){//freopen("test.in","r",stdin);//freopen("my.out","w",stdout);int i,j;scanf("%d%d",&n,&m);for(i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]);for(i=1;i<=n;i++){f[i]=i;for(j=i+1;j<=n;j++)road[++id]=ROAD(i,j,(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));}sort(road+1,road+id+1);m=n-m;for(i=1;i<=id;i++){int fu=find(road[i].u),fv=find(road[i].v);if(fu==fv)continue;f[fv]=fu;if(++cnt>m){printf("%.2lf\n",sqrt(road[i].len));return 0;}}return 0;}
0 0
- 【BZOJ1821】【JSOI2010】Group 部落划分 Group (两个group什么意思
- 【bzoj1821】[JSOI2010]Group 部落划分
- bzoj1821 [JSOI2010]Group 部落划分 Group
- bzoj1821: [JSOI2010]Group 部落划分 Group MST
- 【JSOI2010】【BZOJ1821】Group 部落划分 Group
- bzoj1821: [JSOI2010]Group 部落划分 Group
- bzoj1821: [JSOI2010]Group 部落划分 Group
- bzoj1821: [JSOI2010]Group 部落划分 Group
- bzoj1821: [JSOI2010]Group 部落划分 Group
- BZOJ1821:[JSOI2010]Group 部落划分 Group
- bzoj1821 [JSOI2010]Group 部落划分 Group
- 【bzoj1821】[JSOI2010]Group 部落划分 Group
- [二分+并查集] BZOJ1821 : [JSOI2010]Group 部落划分 Group
- bzoj1821: [JSOI2010]Group 部落划分 Group(最小生成树)
- BZOJ1821 Group 部落划分 Group
- [JSOI2010]Group部落划分
- bzoj1821 [JSOI2010]Group 部落划分(贪心+并查集)
- BZOJ1821 [JSOI2010]Group 部落划分 贪心+并查集
- Android开发中String和byte相互转换
- 在android中如何使应用程序成为桌面
- 南京夜市
- tableview被挡住
- 算法导论-分治、最大子序列问题
- 【BZOJ1821】【JSOI2010】Group 部落划分 Group (两个group什么意思
- 数据库 批量查询结果作为更新的值
- eclipse 打开出现:Workspace in use or cannot be created, choose a different one
- Apache DBCP总览和常用参数说明等
- sql中函数的简单应用
- iOS开发网络数据之AFNetworking使用
- Github上600多个iOS开源项目
- ajax给session赋值
- FFMPEG SDK流媒体开发2---分离.mp4等输入流音视频并且进行解码输出