题意:

  在南极有  N  个科研站,要把这些站用卫星和无线电连接起来,是的任意两个之间都能互相通信,如果其中任意的一个地方安装了卫星,那么就可以和其他安装卫星的互相通信,和距离没有关系,但是安装无线电 是需要费用D的,这个费用 D 为在安装无线电的地方中使用的无线电通信花费最大的那个值。现在有S个卫星可以提供给你安装,还有足够多的无线电设备,让你设计一个方案,使得D的费用最少。

思路:

  首先肯定会用到最小生成树。为了使得我们的D值最小那么我们应该给距离最长的 S - 1个路径的俩段安装无线电(因为 S个无线电可以连通S 个科研站,S个科研站有S- 1条路径)。这样的话设最小生成树一共有 K 条边,那么 第 K - S 条排好序的边就是我们要的答案。而 K = N - 1,所以我们最后要求的就是直接求最小生成树的 第 N - S 条边。

代码:

 1 import java.util.Scanner;
 2 import java.util.Comparator;
 3 import java.util.Arrays;
 4 import java.text.DecimalFormat;
 5
 6 class Node{
 7     public int u, v, mark;
 8     public double w;
 9 }
10 class Points{
11     public double x;
12     public double y;
13 }
14
15 class mycmp implements  Comparator<Node>{
16     public int compare(Node A, Node B){
17                 if(A.w == B.w) return 0;
18                 else if(A.w < B.w) return -1;
19                 else return 1;
20       }
21 }
22 public class Main {
23     final static int MAXN = 250000 + 13;
24     final static int INF = 0x3f3f3f3f;
25     static int[] pre = new int[MAXN];
26     static Node[] map = new Node[MAXN];
27     static Points[] pit = new Points[MAXN];
28     public static void main(String[] args){
29         Scanner sc = new Scanner(System.in);
30         int T = sc.nextInt();
31         while(T != 0){
32             int S, P;
33             S = sc.nextInt();
34             P = sc.nextInt();
35             mst(P);
36             for(int i = 1; i <= P; i++){
37                 pit[i] = new Points();
38                 pit[i].x = sc.nextInt();
39                 pit[i].y = sc.nextInt();
40             }
41             int len = 1;
42             for(int i = 1; i < P; i++){
43                 for(int j = i + 1; j <= P; j++){
44                     map[len] = new Node();
45                     map[len].u = i;
46                     map[len].v = j;
47                     map[len].w = dist(pit[i], pit[j]);
48                     len++;
49                 }
50             }
51             Arrays.sort(map, 1, len,  new mycmp());
52             int k = P - S;  //第 K 条边就是答案
53             double ans = ksu(P, len, k);
54             DecimalFormat df = new DecimalFormat("0.00");
55             String db = df.format(ans);
56             System.out.println(db);
57             T--;
58         }
59         sc.close();
60     }
61     public static double dist(Points a, Points b){
62         return Math.sqrt( (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) );
63     }
64     public static double ksu(int N, int M, int k){
65         int cnt = 0;
66         double ans = map[M - 1].w;//初始化为最大的那条边
67         for(int i = 1; i < M; i++){
68             int fu = Find(map[i].u);
69             int fv = Find(map[i].v);
70             if(fu != fv){
71                 cnt++;
72                 if(cnt == k){ //找到第K条边
73                     ans = map[i].w;
74                 }
75                 pre[fv] = fu;
76                 map[i].mark = 1;
77             }
78         }
79         return ans;
80     }
81     public static int Find(int x){
82         return x == pre[x] ? x : (pre[x] = Find(pre[x]));
83     }
84     public static void mst(int N){
85         for(int i = 1; i <= N; i++){
86             pre[i] = i;
87         }
88     }
89 }

转载于:https://www.cnblogs.com/Ash-ly/p/5397636.html

UVA 10369 - Arctic NetWork (求最小生成树)相关推荐

  1. Arctic Network题解+(最小生成树二次理解 )

    由于在上一篇文章用了大量的文字已经对于最小生成树的两种算法(克鲁斯卡尔和普利姆算法)做了基础的讲解,下面的话我就大概说一下思想和解题步骤,然后再在附加上一个昨天做题(虽然说很基础但是对于初学的我就有点 ...

  2. Prim算法和Kruskal算法求最小生成树

    Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小 ...

  3. CSP认证201412-4 最优灌溉[C++题解]:最小生成树裸题、Kruskal算法求最小生成树

    题目分析 来源:acwing 分析:这是一道最小生成树的裸题. 这里默写Kruskal求最小生成树的最小费用的模板. 最小生成树模板请参考笔者的另一篇博文: 最小生成树板子-AcWing 859. K ...

  4. prim算法求最小生成树_克鲁斯卡尔算法(Kruskal算法)求最小生成树

    上一节介绍了求最小生成树之普里姆算法.该算法从顶点的角度为出发点,时间复杂度为O(n2),更适合与解决边的绸密度更高的连通网.本节所介绍的克鲁斯卡尔算法,从边的角度求网的最小生成树,时间复杂度为O(e ...

  5. C语言Prims求最小生成树MST的算法(附完整源码)

    C语言Prims求最小生成树MST的算法 C语言Prims求最小生成树MST的算法完整源码(定义,实现,main函数测试) C语言Prims求最小生成树MST的算法完整源码(定义,实现,main函数测 ...

  6. C语言实现克鲁斯卡尔Kruskal算法求最小生成树(附完整源码)

    Kruskal算法求最小生成树 Edge结构体,Graph结构体 Kruskal算法求最小生成树完整源码(定义,实现,main函数测试) Edge结构体,Graph结构体 // a structure ...

  7. UVA10369 Arctic Network

    传送门 求一棵最小生成树,要求:忽略树上s-1条边的边权后,最大的边最小. (因为卫星频道是两两互达的,所以想把连接两个联通块之间的边权忽略必须用两个联通块都放置卫星频道.也就是至少要两个) emmm ...

  8. prim算法求最小生成树_最小生成树的两种方法(Kruskal算法和Prim算法)

    关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连 ...

  9. HDU 1301 - Jungle Roads( Prim求最小生成树 )

    题意 给出n个编号为A~A+n的节点,和某些节点之间的距离,求最小生成树的总权值 思路 裸的Prim算法求最小生成树 算法细节: 最小生成树-Prim算法和Kruskal算法 AC代码 #includ ...

  10. UVA 1329 Corporative Network(并查集:路径压缩)

    UVA 1329 Corporative Network(并查集:路径压缩) 2014年03月09日 00:19:33 阅读数:914 UVA 1329 Corporative Network(并查集 ...

最新文章

  1. 人天生就会除法,宾大最新研究:儿童啥都不学也能算出来
  2. 效率提升多倍, 推荐值得收藏40 个命令总结
  3. 干货 | 一文教你如何快速高效阅读Paper(硕士生版)
  4. emwin之基于某个事件或标志创建某个界面的一种方法
  5. 快手公司厕所装计时器,网友:再也不能带薪拉屎了!
  6. 注册中心—注册中心原理
  7. 你们班上的同学现在都怎么样了?
  8. [转]其实每个男孩都想做一个感情专一的好男人
  9. Docker教程:使用docker配置python开发环境
  10. MySQL Front的作者到底何许人也,这款好用的sql可视化软件背后有什么故事。。
  11. MIT License探讨
  12. 【译文】人工智能给伦敦带来了它的大脑和经济收益
  13. 树莓派CM4基于emmc安装Ubuntu系统及初始配置
  14. Java 程序员月薪3.8万,需要技术达到什么水平?
  15. Flink计算pv和uv的通用方法
  16. Java并发编程(一)——并发的基本概念
  17. Linux修改和恢复服务器时间
  18. vue3自定义开发酒店房态时间组件
  19. MISC相关工具下载
  20. 虚拟机扩展(VMX)简介

热门文章

  1. 产生1000w不重复的数字
  2. php冗余,php – 如何使用规范化删除冗余?
  3. 飞思卡尔c语言,飞思卡尔MCU的C语言编程框架
  4. TSAP(2) : 时区切换
  5. 实战 Kaggle 比赛:图像分类(CIFAR-10) 动手学深度学习v2
  6. 阿里云云计算 48 云安全中心
  7. Xcode 快捷键大全 2020 - 持续更新
  8. 算法:Validate Binary Search Tree(验证二叉查找树)
  9. linux命令hexdump,Linux中hexdump命令起什么作用呢?
  10. java lambda有必要_深度分析:java8的新特性lambda和stream流,看完你学会了吗?