题目传送:https://loj.ac/p/10065

1、排序函数sort,任何一种排序算法都行,下面的示例代码中,我采用的是冒泡排序算法

2、寻源函数getRoot,寻找某一个点在并查集中的根,注意,是根,不是双亲!,所以,判断的条件为如果某一个下标的值就是其本身,设a为并查集数组,v为数组值,如果a[v] = v,它就是根,否则就让v = a[v],向上寻找,直到其相等。

1图的存储结构(a,b为边的两个顶点,w为边的权值),初始化

2.排序sort函数(按照权值从小到大)

3.getRoot寻源函数(v为并查集,x为待查顶点)

4.for循环遍历

 1 #include <bits/stdc++.h>
2 using namespace std;
3 #define x first
4 #define y second
5 const int mx= 250100;
6 int n,k;
7 typedef pair<int,int> PII;
8 struct node{
9 int x,y;
10 double z;
11 };
12 bool operator <(node &a,node &b)
13 {
14 return a.z<b.z;
15 }
16
17 int f[mx];
18 PII q[mx];
19 node edge[mx];
20
21 int get(int x)
22 {
23 return x==f[x]?x:get(f[x]);
24 }
25
26 double getdist(PII a,PII b)
27 {
28 int dx=a.x-b.x;
29 int dy=a.y-b.y;
30 return sqrt(dx*dx+dy*dy);
31 }
32
33 int main()
34 {
35 cin>>n>>k;
36 for(int i=1;i<=n;i++)
37 {
38 cin>>q[i].x>>q[i].y;
39 }
40 int m=0;
41 for(int i=1;i<=n;i++)
42 {
43 for(int j=1;j<=i;j++)
44 {
45 edge[++m].x=i;
46 edge[m].y=j;
47 edge[m].z=getdist(q[i],q[j]);
48 }
49 }
50 sort(edge+1,edge+1+m);
51 for(int i=1;i<=m;i++) f[i]=i;
52 int cnt=n;
53 double ans=0;
54 for(int i=1;i<=m;i++)
55 {
56 if(cnt<=k) break;
57 int a=get(edge[i].x),b=get(edge[i].y);
58 double w=edge[i].z;
59 if(a!=b)
60 {
61 f[a]=b;
62 cnt--;
63 ans=w;
64 }
65 }
66 printf("%.2lf\n",ans);
67 }

克鲁斯卡尔算法(Kruskal算法)求最小生成树的更多相关文章

  1. 最小生成树之克鲁斯卡尔(Kruskal)算法

    学习最小生成树算法之前我们先来了解下 下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的 ...

  2. c/c++ 用克鲁斯卡尔(kruskal)算法构造最小生成树

    c/c++ 用克鲁斯卡尔(kruskal)算法构造最小生成树 最小生成树(Minimum Cost Spanning Tree)的概念: 假设要在n个城市之间建立公路,则连通n个城市只需要n-1条线路 ...

  3. 克鲁斯卡尔(Kruskal)算法

    概览 相比于普里姆算法(Prim算法),克鲁斯卡尔算法直接以边为目标去构建最小生成树.从按权值由小到大排好序的边集合{E}中逐个寻找权值最小的边来构建最小生成树,只要构建时,不会形成环路即可保证当边集 ...

  4. JS实现最小生成树之克鲁斯卡尔(Kruskal)算法

    克鲁斯卡尔算法打印最小生成树: 构造出所有边的集合 edges,从小到大,依次选出筛选边打印,遇到闭环(形成回路)时跳过. JS代码: //定义邻接矩阵 let Arr2 = [ [0, 10, 65 ...

  5. 数据结构与算法——克鲁斯卡尔(Kruskal)算法

    目录 应用场景-公交站问题 克鲁斯卡尔算法介绍 克鲁斯卡尔算法图解 克鲁斯卡尔算法分析 如何判断回路? 代码实现 无向图构建 克鲁斯卡尔算法实现 获取一个点的终点解释 应用场景-公交站问题 某城市新增 ...

  6. 最小生成树(prime算法 & kruskal算法)和 最短路径算法(floyd算法 & dijkstra算法)

    一.主要内容: 介绍图论中两大经典问题:最小生成树问题以及最短路径问题,以及给出解决每个问题的两种不同算法. 其中最小生成树问题可参考以下题目: 题目1012:畅通工程 http://ac.jobdu ...

  7. 最小生成树(Prim算法+Kruskal算法)

    什么是最小生成树(MST)? 给定一个带权的无向连通图,选取一棵生成树(原图的极小连通子图),使生成树上所有边上权的总和为最小,称为该图的最小生成树. 求解最小生成树的算法一般有这两种:Prim算法和 ...

  8. 最小生成树之算法记录【prime算法+Kruskal算法】【模板】

    首先说一下什么是树: 1.只含一个根节点 2.任意两个节点之间只能有一条或者没有线相连 3.任意两个节点之间都可以通过别的节点间接相连 4.除了根节点没一个节点都只有唯一的一个父节点 5.也有可能是空 ...

  9. hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)

    还是畅通工程                                                                            Time Limit: 4000/2 ...

  10. 最小生成树 Prim算法 Kruskal算法实现

    最小生成树定义 最小生成树是一副连通加权无向图中一棵权值最小的生成树. 在一给定的无向图 G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即,而 w(u, v) 代表此边的 ...

随机推荐

  1. Java进阶基础18天课程大总结

    知识点目录 day1:分类思想,static关键字 day2:面向对象-继承,抽象类,权限修饰符,final day3:接口,多态 day4:内部类,Lambda day5:工具类API,系统API, ...

  2. 【MyBatis】自定义 MyBatis

    自定义 MyBatis 文章源码 执行查询信息的分析 我们知道,MyBatis 在使用代理 DAO 的方式实现增删改查时只做两件事: 创建代理对象 在代理对象中调用 selectList() 配置信息 ...

  3. python模块详解 | psutil

    目录 psutil 简介 psutil的功能函数 cpu memory_内存 disk_磁盘 net_网络 pid_进程管理 sensors_传感器 其他(用户,启动时间) psutil简介 psut ...

  4. 【Linux】用yum来下载rpm,而不安装

    方法一:yum yum命令本身就可以用来下载一个RPM包,标准的yum命令提供了--downloadonly(只下载)的选项来达到这个目的. $ sudo yum install --download ...

  5. SDUST数据结构 - chap1 绪论

    一.判断题: 二.选择题:                          

  6. CTFHub - Misc(流量分析)

    数据库类流量: MySQL流量: 1.下载附件,是一个.pcap文件,用wireshark分析, 2.搜索ctfhub字段,即可得到flag, flag: ctfhub{mysql_is_S0_E4s ...

  7. 如何用Python中自带的Pandas和NumPy库进行数据清洗

    一.概况 1.数据清洗到底是在清洗些什么? 通常来说,你所获取到的原始数据不能直接用来分析,因为它们会有各种各样的问题,如包含无效信息,列名不规范.格式不一致,存在重复值,缺失值,异常值等..... ...

  8. 控制tomcat日志文件的输出到catalina.out

    在catalina.sh中直接把下面的内容注释掉即可:

  9. 编程小技巧之 Linux 文本处理命令(二)

    合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也.合理的利用 Linux 的命令行工具,可以提高我们的工作效率. 本篇文章是<Linux 文本处理命令> 续篇,在前文的基础上再介 ...

  10. Linux、JDK、Netty中的NIO与零拷贝

    一.先理解内核空间与用户空间 Linux 按照特权等级,把进程的运行空间分为内核空间和用户空间,分别对应着下图中, CPU 特权等级分为4个,Linux 使用 Ring 0 和 Ring 3. 内核空 ...