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

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

Solution

\(Kruskal\) 加一点点东西就好...

\(n\) 很小,可以暴力搞出所有的边.
然后按照边的大小排序. 用一个并查集维护关系.
同时记录联通块的数量,大于 \(k\) 的时候照样维护关系.
如果已经等于 \(k\) ,直接找到第一条两端点不在同一联通块的边输出就好.

Code

#include
#define db doubleusing namespace std;const int maxn=1008;struct sj{ int to,fr; db w;}a[maxn*maxn];int fa[maxn],num[maxn];int n,k,cnt,pp;db x[maxn],y[maxn],ans;int read(){ char ch=getchar(); int f=1,w=0; while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch<='9'&&ch>='0'){w=w*10+ch-'0';ch=getchar();} return f*w;}bool cmp(sj x,sj y){return x.w
num[y])swap(x,y); if(x!=y)fa[x]=y; num[y]+=num[x]; num[x]=0;}int main(){ n=read(); k=read(); pp=n; for(int i=1;i<=n;i++) x[i]=db(read()),y[i]=db(read()),fa[i]=i; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) { a[++cnt].fr=i,a[cnt].to=j; a[cnt].w=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } sort(a+1,a+cnt+1,cmp); for(int i=1;i<=cnt;i++) { int x=a[i].fr,y=a[i].to; if(pp>k) { if(find(x)!=find(y)) {join(x,y);pp--;} } else if(find(x)!=find(y)) {printf("%.2lf\n",a[i].w);break;} } return 0;}

转载于:https://www.cnblogs.com/Kv-Stalin/p/9578510.html

你可能感兴趣的文章
软件工程第三次作业2
查看>>
新手怎么读懂一个中型的Django项目
查看>>
Oracle 执行语句时卡死
查看>>
JavaEE中对Session操作
查看>>
训练超参数, 出现 Cannot use GPU in CPU-only Caffe 错误?
查看>>
LINUX下QT与C语言通过网卡名获取网卡IP与MAC
查看>>
如何进入到Docker容器内部
查看>>
PDO
查看>>
MXNET:卷积神经网络
查看>>
朴素贝叶斯原理和应用
查看>>
如何获取AppStore软件安装包的路径
查看>>
二维数组排序
查看>>
Cocos2d和UIKit的结合使用
查看>>
udp网络程序-发送、接收数据
查看>>
面相对象基础语法
查看>>
java基础知识总结--多线程
查看>>
MyBatis配置文件
查看>>
Javascript 学习杂记
查看>>
HDU 1244 Max Sum Plus Plus Plus
查看>>
UVa 10817 (状压DP + 记忆化搜索) Headmaster's Headache
查看>>