本题的描述:城市联盟,最短距离。。

使人想到了prim求MST,再一看数据范围:完全图!,那么一定得用prim,因为只有5000个点,所以不加优化的prim就能过。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN=5005;
int init(){
int rv=0,fh=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
rv=(rv<<1)+(rv<<3)+c-'0';
c=getchar();
}
return rv*fh;
}
int n,x[MAXN],y[MAXN];
double dis[MAXN],tot;
bool f[MAXN];
double cal(int a,int b){
double r1=x[a]-x[b],r2=y[a]-y[b];
return sqrt(r1*r1+r2*r2);
}
int main(){
freopen("in.txt","r",stdin);
n=init();
for(int i=1;i<=n;i++){
x[i]=init();y[i]=init();
}
memset(dis,0x7f,sizeof(dis));
dis[1]=0.0;
f[1]=1;
for(int i=2;i<=n;i++){
dis[i]=cal(1,i);
}
for(int k=2;k<=n;k++){
double mi=1e20;
int t=0;
for(int i=1;i<=n;i++){
if(!f[i]){
if(dis[i]<mi) {mi=dis[i];t=i;}
}
}
if(t==0) break;
tot+=mi;
f[t]=1;
for(int i=1;i<=n;i++){
if(!f[i]){
dis[i]=min(dis[i],cal(t,i));
}//在这里写的时候有一种dijkstra的感觉,但要注意这里的dis[]表示的是到已生成的MST的距离,
不是到某一点的距离。
}
}
printf("%.2lf",tot);
fclose(stdin);
return 0;
}

noip完了之后要学堆优化prim。。。。

最新文章

  1. PHP运算符:算数运算符、逻辑运算符、三目运算符、位运算符、字符串运算符。
  2. ArcGIS移动开发策略的选择[转]
  3. select into from 和 insert into select 的用法和区别
  4. hibernate3和spring整合的一些方式
  5. Thrift安装问题
  6. 8款超酷而实用的CSS3按钮动画
  7. mac搭建PHP开发环境
  8. JavaScript中,按值传递与按地址(引用)传递。
  9. Java中View游戏开发框架
  10. BZOJ 3196 二逼平衡树
  11. C#中(int)a和Convert.ToInt32(a)的区别
  12. (转)centos6.5安装VNC
  13. ABP官方文档翻译 4.5 特征管理
  14. [一个脑洞] Candy?&#39;s 不饱和度
  15. 沉淀,再出发——安装windows10和ubuntu kylin15.04双系统心得体会
  16. 改数据库编码latin1为utf8
  17. Zabbix11.3 Zabbix SNMP 常用OID列表
  18. visual studio属性管理器
  19. P2648 赚钱
  20. 【区块链Go语言实现】Part 2:工作量证明机制POW

热门文章

  1. Redis介绍及Jedis测试
  2. [国嵌攻略][107][Linux进程管理子系统]
  3. Android开发——BroadcastReceiver广播的使用
  4. 用NPOI导出Excel,生成下拉列表、以及下拉联动列表(第1篇/共3篇)
  5. memcached集群和一致性哈希算法
  6. for循环,数组
  7. 将js进行到底:node学习笔记1
  8. s​q​l​i​t​e​3​-​入​门​教​程
  9. 使用VSCode和VS2017编译调试STM32程序
  10. mysql的水平拆分和垂直拆分