博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ1821][JSOI2010]部落划分
阅读量:5305 次
发布时间:2019-06-14

本文共 1563 字,大约阅读时间需要 5 分钟。

感觉学了这么久还是有那么一丢丢进步的...上个学期看到这道题,虽然早就学过并查集和二分了但还是一点思路都没有,现在可以秒切了呢

思路就是二分+并查集,有些人说是生成树,其实它没有变成树,只是运用了生成树的思想而已

分析

求距离最小的最大值,考虑二分

求距离那我们就二分距离吧

考虑check()函数

显然如果我们当前的二分的距离为x,那么两点间的距离小于x的时候它们显然是在同一个部落里的,所以我们先按边权排序,然后枚举每条边的距离是否小于x,若小于就加入并查集更新,否则直接break退出

#include
#pragma GCC optimize(3)#pragma GCC optimize(2)#pragma GCC optimize("Ofast")#include
#include
#include
using namespace std;inline int read(){ int ans=0,f=1;char chr=getchar(); while(!isdigit(chr)){if(chr=='-') f=-1;chr=getchar();} while(isdigit(chr)){ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();} return ans*f;}int n,m,tot,fa[1001],ans,l=0,r=100000000,mid;;struct P{int x,y;}a[1001];struct Q{int x,y,z;}t[1000001];inline int dist(int x1,int y1,int x2,int y2){return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);}inline void add(int x,int y){t[++tot].x=x;t[tot].y=y;t[tot].z=dist(a[x].x,a[x].y,a[y].x,a[y].y);}bool operator < (const Q &x,const Q &y){return x.z
x) break; int fx=t[i].x,fy=t[i].y; fx=find(t[i].x),fy=find(t[i].y); if(fx==fy) continue; fa[fx]=fy; }int k=0; for(int i=1;i<=n;i++) if(fa[i]==i) k++; return k>=m;}int main(){ n=read();m=read(); for(int i=1;i<=n;i++) a[i].x=read(),a[i].y=read(); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) add(i,j); sort(t+1,t+tot+1); while(l<=r){ mid=l+r>>1; if(check(mid)) l=mid+1; else r=mid-1,ans=mid; }return !printf("%.2f",sqrt(ans));}

转载于:https://www.cnblogs.com/zhenglw/p/10529540.html

你可能感兴趣的文章
标识符
查看>>
给大家分享一张CSS选择器优选级图谱 !
查看>>
Win7中不能调试windows service
查看>>
通过httplib2 探索的学习的最佳方式
查看>>
快来熟练使用 Mac 编程
查看>>
Node.js 入门:Express + Mongoose 基础使用
查看>>
一步步教你轻松学奇异值分解SVD降维算法
查看>>
使用pager进行分页
查看>>
UVA - 1592 Database
查看>>
Fine Uploader文件上传组件
查看>>
javascript中的传递参数
查看>>
objective-c overview(二)
查看>>
python查询mangodb
查看>>
consonant combination
查看>>
驱动的本质
查看>>
Swift的高级分享 - Swift中的逻辑控制器
查看>>
Swagger简单介绍
查看>>
Python数据分析入门案例
查看>>
vue-devtools 获取到 vuex store 和 Vue 实例的?
查看>>
Linux 中【./】和【/】和【.】之间有什么区别?
查看>>