朴素版prim算法

时间复杂度是 O(n^2+m), n 表示点数,m 表示边数

int n;      // n表示点数
int g[N][N];        // 邻接矩阵,存储所有边
int dist[N];        // 存储其他点到当前最小生成树的距离
bool st[N];     // 存储每个点是否已经在生成树中// 如果图不连通,则返回INF(值是0x3f3f3f3f), 否则返回最小生成树的树边权重之和
int prim()
{memset(dist, 0x3f, sizeof dist);int res = 0;for (int i = 0; i < n; i ++ ){int t = -1;for (int j = 1; j <= n; j ++ )if (!st[j] && (t == -1 || dist[t] > dist[j]))t = j;if (i && dist[t] == INF) return INF;if (i) res += dist[t];st[t] = true;for (int j = 1; j <= n; j ++ ) dist[j] = min(dist[j], g[t][j]);}return res;
}

Prim算法求最小生成树

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 510, INF = 0x3f3f3f3f;int n, m;
int g[N][N], dist[N];
bool st[N]; // 记录当前点在集合内还是集合外int prim()
{memset(dist, 0x3f, sizeof dist);int res = 0;for (int i = 0; i < n; i++) {// 找一个最短边权的点int t = -1;for (int j = 1; j <= n; j++)if (!st[j] && (t == -1 || dist[t] > dist[j]))t = j;// 不是第一个取出的节点, 并且当前节点的距离为INF, 则表示没有和集合中点相连的边。  if (i && dist[t] == INF) return INF;// 写在前面,如果一个节点本身出现负环// 下面这句更新后, 会影响结果, 比如g[t][j], 当t = j,更新了g[t][t], 影响res结果// 比如4->4 -10, 更新后dist[4] = min(dist[4], g[4][4])if (i) res += dist[t];for (int j = 1; j <= n; j++) dist[j] = min(dist[j], g[t][j]);st[t] = true;}return res;
}int main()
{scanf("%d%d", &n, &m);memset(g, 0x3f, sizeof g);while (m--) {int u, v, w;scanf("%d%d%d", &u, &v, &w);g[u][v] = g[v][u] = min(g[v][u], w);}int t = prim();if (t == INF) puts("impossible");else printf("%d\n", t);return 0;
}

【Algorithm】Prim相关推荐

  1. 【图解】Prim和Kruskal算法的区别

    [贪心]Prim和Kruskal算法的区别 Kruskal算法和Prim算法的优劣 Kruskal算法,相较于Prim算法是基于点的操作,Kruskal算法是基于边的操作,思想也比Prim简单,更容易 ...

  2. 【Algorithm】种子填充算法

    转载:https://www.cnblogs.com/icmzn/p/5065306.html [平面区域填充算法]是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界 (也可以是没有边 ...

  3. C++【算法】 | 【algorithm】常用方法

    文章目录 all_of :所有元素是否都 any_of :所有元素是否存在 none_of :是否都没有满足条件 for_each:将自定义函数用于指定范围 find :查找指定范围内的值 find_ ...

  4. 【Tree】Prim算法思想与步骤

    Prim 算法思想: 从任意一顶点 v0 开始选择其最近顶点 v1 构成树 T1,再连接与 T1 最近顶点 v2 构成树 T2, 如此重复直到所有顶点均在所构成树中为止. Prim 算法步骤: T0 ...

  5. 【算法】prim算法(最小生成树)(与Dijkstra算法的比较)

    最小生成树: 生成树的定义:给定一个无向图,如果它的某个子图中任意两个顶点都互相连通并且是一棵树,那么这棵树就叫做生成树.(Spanning Tree) 最小生成树的定义:在生成树的基础上,如果边上有 ...

  6. 【最小生成树】Prim算法和Kruskal算法的区别对比

    Prim算法和Kruskal算法都是从连通图中找出最小生成树的经典算法- 从策略上来说,Prim算法是直接查找,多次寻找邻边的权重最小值,而Kruskal是需要先对权重排序后查找的- 所以说,Krus ...

  7. 【Java】Prim最小生成树

    题目描述 使用Prim算法求图的最小生成树(MST) 输入 每组数据分为两个部分,第一部分为图的点数n,和边数m, 第二部分为m行,每一行输入三个数字,前两个为两个顶点的编号,第三个为边权重. 输出 ...

  8. 【Algorithm】 Reservoir Sampling Shuffle an Array

    Reservoir Sampling Example Question: Randomly choosing k samples from a list of n items, where n is ...

  9. 【Algorithm】冒泡排序

    一. 算法描述 冒泡排序思想:依次比较相邻的数据,将小数据放在前,大数据放在后:即第一趟先比较第1个和第2个数,大数在后,小数在前,再比较第2个数与第3个数,大数在后,小数在前,以此类推则将最大的数& ...

最新文章

  1. CSMAR 智能财经报告分析平台帮助
  2. 用原生JS读写CSS样式的方法总结
  3. 图像灰度变换及图像数组操作
  4. js 实现网页显示倒计时
  5. python-两种办法验证数据的类型
  6. linux tomcat启动nohup,linux下tomcat添加服务
  7. C/C++ 常见误区
  8. java jdialog 模态_java – 如何在另一个模态JDialog之上创建一个模态的JDialog
  9. 高级着色语言HLSL入门(4)
  10. 浅谈JSONP 的本质工作原理
  11. 解题报告 poj 2528 (罕见的浮水法解这个题的。。。。。。)
  12. matlab 对话框大小调整,matlab界面设计---对话框设计
  13. 数据库 | MitoPhen 数据库:基于人体表型进行线粒体 DNA 疾病诊断
  14. DBA01 - 数据库服务概述 构建MySQL服务器、数据库基本管理 MySQL数据类型
  15. 黑白图片复原为彩色Picture Colorizer(图片着色器)
  16. 海康硬盘录像机 rtsp/onvif 视频配置
  17. VB如何自动保存_VB编写的身份证号自动识别实用程序
  18. nian shi ti是什么鬼????
  19. 树莓派 3b jupyter notebook 设置为后台服务
  20. 盘点世界上奇怪的 6 种编程语言

热门文章

  1. 江苏华西村海洋工程服务有限公司-船讯网
  2. WS小世界网络的仿真实现
  3. android做一个音乐播放器,制作一个简单的Android版的音乐播放器
  4. Contiki学习平台推荐
  5. Minecraft空岛服开服
  6. 致敬第一个1024(第一次Java代码编程)
  7. 关于“复活节Easter”知识,你了解多少?
  8. 通过API访问阿里云效Codeup代码库,检查某个文件是否存在更新并下载的方法,顺带介绍一下阿里云OpenAPI
  9. 平衡二叉树(Java实现)
  10. Nginx代理https强制http跳转https