题目

n个村庄间架设通信线路,每个村庄间的距离不同,如何架设最节省开销?

Kruskal算法

特点

  • 适用于稀疏图,时间复杂度 是nlogn的。

核心思想

  • 从小到大选取不会产生环的边。

代码实现

代码中需要采用并查集的方法检测是否有环。

  1. static class Edge {
  2. int a, b, val;
  3. public Edge(int a, int b, int val) {
  4. this.a = a;
  5. this.b = b;
  6. this.val = val;
  7. }
  8. }
  9. int[] father;
  10. // 并查集——寻找当前集合的代表元素
  11. int find(int x) {
  12. if (father[x] != x) father[x] = find(father[x]);
  13. return father[x];
  14. }
  15. int Kruskal(Edge[] edge) {
  16. int res = 0;
  17. int n = edge.length;
  18. father = new int[n];
  19. // 初始化并查集代表元素
  20. for (int i = 1; i <= n; i ++ ) father[i] = i;
  21. // 升序排序
  22. Arrays.sort(edge, (a, b) -> a.val - b.val);
  23. for (Edge value : edge) {
  24. int a = value.a, b = value.b;
  25. // 如果不会产生环,则添加边
  26. if (find(a) != find(b)) {
  27. res += value.val;
  28. // 合并两个点到一个块中
  29. father[find(a)] = find(b);
  30. }
  31. }
  32. return res;
  33. }

prim算法

特点

  • 适用于稠密图,时间复杂度 是n方的。

核心思想

  • 每次挑选与当前集合连接的最短边。

代码实现

  1. public int Prim() {
  2. int res = 0;
  3. for (int i = 1; i <= n; i ++ ) {
  4. dist[i] = INF;
  5. st[i] = false;
  6. }
  7. dist[1] = 0;
  8. for (int i = 1; i <= n; i ++ ) {
  9. int id = -1, min_dist = INF;
  10. // 寻找最短边
  11. for (int j = 1; j <= n; j ++ )
  12. if (!st[j] && dist[j] < min_dist) {
  13. id = j;
  14. min_dist = dist[j];
  15. }
  16. st[id] = true;
  17. res += dist[id];
  18. // 用新加入的点更新其余点到生成树的最短边
  19. for (int j = 1; j <= n; j ++ )
  20. if (!st[j])
  21. dist[j] = min(dist[j], g[id][j]);
  22. }
  23. return res;
  24. }

总结

还是Kruskal算法更容易实现一些,只要遍历每条边就好了。

算法(图论)——最小生成树及其题目应用(prim和Kruskal算法实现)的更多相关文章

  1. 经典算法题每日演练——第十六题 Kruskal算法

    原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0, ...

  2. 图论---最小生成树----普利姆(Prim)算法

    普利姆(Prim)算法 1. 最小生成树(又名:最小权重生成树) 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一 ...

  3. [数据结构]最小生成树算法Prim和Kruskal算法

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树.  例如,对于如上图G4所示的连通网可以有多棵权值总 ...

  4. 无向带权图的最小生成树算法——Prim及Kruskal算法思路

    边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...

  5. 图的最小生成树的理解和实现:Prim和Kruskal算法

    最小生成树 一个连通图的生成树是一个极小的连通子图,它含有图中所有的顶点,但只有足以构成一棵树的n-1条边.我们将构造连通网的最小代价生成树称为最小生成树(Minimum Cost Spanning ...

  6. prim和kruskal算法

    //邻接矩阵 int n,G[MAXV][MAXN]; int d[MAXV];//表示到树的距离 bool vis[MAXV]={false}; int prim(){ fill(d,d+MAXV, ...

  7. 【算法设计与分析基础】24、kruskal算法详解

    首先我们获取这个图 根据这个图我们可以得到对应的二维矩阵图数据 根据kruskal算法的思想,首先提取所有的边,然后把所有的边进行排序 思路就是把这些边按照从小到大的顺序组装,至于如何组装 这里用到并 ...

  8. 【2018寒假集训Day 8】【最小生成树】Prim和Kruskal算法模板

    Luogu最小生成树模板题 Prim 原理与dijkstra几乎相同,每次找最优的点,用这个点去松弛未连接的点,也就是用这个点去与未连接的点连接. #include<cstdio> #in ...

  9. 图论——最小生成树:Prim算法及优化、Kruskal算法,及时间复杂度比较

    最小生成树: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.简单来说就是有且仅有n个点n-1条边的连通图. 而最小生成树就是最小权 ...

随机推荐

  1. python之深浅copy与id

    我们都知道 所谓变量就是就是在空间中开辟一块内存空间.来存放东西的 学过c语言的都知道而数组也是有内存地址的 我们如何来查看内存地址呢?id()这函数就来了 x = 5 print(id(x)) 如此 ...

  2. Markdown 常用语言关键字

    Markdown 语法高亮支持的语言还是比较多的,记下来备用. 语言名 关键字 Bash bash CoffeeScript coffeescript C++ cpp C# cs CSS css Di ...

  3. 一次webpack小规模优化经历

    这标题一点营销号味道都没有,怎么会有人看啊!(笑) 没人看也无所谓的文章背景: 八月份入职了新公司,是个好几年的老项目了,公司产品是存在很久了,但我接触到的代码版本保守估计应该是有个三年到四年这样的历 ...

  4. cephfs元数据池故障的恢复

    前言 cephfs 在L版本已经比较稳定了,这个稳定的意义个人觉得是在其故障恢复方面的成熟,一个文件系统可恢复是其稳定必须具备的属性,本篇就是根据官网的文档来实践下这个恢复的过程 实践过程 部署一个c ...

  5. bWAPP----OS Command Injection

    OS Command Injection 界面: 给一个域名,它帮你返回DNS 代码: 1 <div id="main"> 2 3 <h1>OS Comma ...

  6. [转载]Redis 持久化之RDB和AOF

    原文链接:https://www.cnblogs.com/itdragon/p/7906481.html 温馨提示 在正式数据(当然是非生产环境啦)练习以下操作时,一定一定一定记得备份dump.rdb ...

  7. appium 启动参数配置

    启动配置参数,可以参照官网: http://appium.io/docs/en/writing-running-appium/caps/#general-capabilities from appiu ...

  8. php 缩略图封装的方法

    /** * PHP生成缩略图 * @param $basepath /原文件地址 * @param $des_w /缩略图的宽 * @param $des_h /缩略图的高 * @param $sty ...

  9. Java基础教程——线程局部变量

    线程局部变量 ThreadLocal,线程局部变量,不提供锁,不做线程共享,而是为每个线程提供变量的独立副本. import java.util.concurrent.*; public class ...

  10. 超稳攻略!Rancher 2.3手动轮换证书,保护集群安全!

    本文转自Rancher Labs 前 言 Rancher 2.3正式发布已经一年,第一批使用Rancher 2.3的用户可能会遇到Rancher Server证书过期,但是没有自动轮换的情况.这会导致 ...