总结一下:

如果选 0为起点,low_cost[i]表示以 0这个起点到i 这个终点的权值,我们找最小的权值的终点i,然后以i为起点,去更新low_cost[]这个数组,如果与i相连的数是j,现在有两种情况,j与0相连,j与i相连但不与0相连。如果j也与0相连,我们找0到j和i到j这两者的最小距离,然后用这个最小的距离更新low_cost[j]。如果j不与0相连,那么就直接填上low_cost[j]

代码分析一下:

matrix[i][j]=m意思是以i为起点j为终点的权值为m
path[i]=a,意思是i起点连的是a终点
由此我们可见数组可以表达的意思可以是那几个变量之间的相关性

visit数组存的是目前最小生成树上已经有的结点,我们最小生成树最终是要有所有的结点的

先找一个起点,然后把与起点相连的路径都存到low_cost里

找一个终点,起点到他的权值最小,将这个终点进行标记(证明已经将其加入到最小生成树里面了),并且记录最小路径和的sum要加上他的权值

由于low_cost目前只存了与起点相连的路径,现在最小生成树里面加入了一个新的结点,那么我们就需要更新low_cost数组,把与这个新的结点相连的路径加入到low_cost数组里,路径就要考虑终点,这个终点一定不是在最小生成树里的,所以要用到visit数组,然后如果matrix[min_cost_index][j]就是这个新节点到某一终点的权值比low_cost[j]小的话,就更新low_cost[j]

#include <iostream>using namespace std;int  matrix[100][100]; // 邻接矩阵
bool visited[100];     // 标记数组
int  low_cost[100];    // 边的权值
int  path[100];        // 记录生成树的路径
int  source;           // 指定生成树的起点
int  vertex_num;       // 顶点数
int  edge_num;         // 边数
int  sum;              // 生成树权和void Prim(int source)
{memset(visited, 0, sizeof(visited));visited[source] = true;for (int i = 0; i < vertex_num; i++){low_cost[i] = matrix[source][i];path[i] = source;}int min_cost;       // 权值最小int min_cost_index; // 权值最小的下标sum = 0;for (int i = 1; i < vertex_num; i++) // 除去起点,还需要找到另外 vertex_num-1 个点{min_cost = INT_MAX;for (int j = 0; j < vertex_num; j++){if (visited[j] == false && low_cost[j] < min_cost) // 找到权值最小{min_cost = low_cost[j];min_cost_index = j;}}visited[min_cost_index] = true;  // 该点已找到,进行标记sum += low_cost[min_cost_index]; // 更新生成树权和for (int j = 0; j < vertex_num; j++) // 从找到的最小下标更新 low_cost 数组{if (visited[j] == false && matrix[min_cost_index][j] < low_cost[j]){low_cost[j] = matrix[min_cost_index][j];path[j] = min_cost_index;}}}
}int main()
{cout << "请输入图的顶点数(<=100):";cin >> vertex_num;cout << "请输入图的边数:";cin >> edge_num;for (int i = 0; i < vertex_num; i++)for (int j = 0; j < vertex_num; j++)matrix[i][j] = INT_MAX; // 初始化 matrix 数组cout << "请输入边的信息:\n";int u, v, w;for (int i = 0; i < edge_num; i++){cin >> u >> v >> w;matrix[u][v] = matrix[v][u] = w;}cout << "请输入起点(<" << vertex_num << "):";cin >> source;Prim(source);cout << "最小生成树权和为:" << sum << endl;cout << "最小生成树路径为:\n";for (int i = 0; i < vertex_num; i++)if (i != source)cout << i << "----" << path[i] << endl;return 0;
}
/*
请输入图的顶点数(<=100):5
请输入图的边数:7
请输入边的信息:
0 1 8
0 2 3
0 3 2
1 3 3
3 2 4
2 4 1
3 4 5
请输入起点(<5):0
最小生成树权和为:9
最小生成树路径为:
1----3
2----0
3----0
4----2
*/

不过上面这个适合理解不适合去作为模板
因为往往下标从一开始
这有一个模板

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 150
#define INF 99999999
int ma[N][N];
long long d[N],vis[N];
int n;
long long prim(int s)
{memset(vis,0,sizeof(vis));for(int i=1; i<=n; i++)d[i]=i==s?0:ma[s][i];vis[s]=1;long long ans=0;for(int i=1; i<n; i++){int maxn=INF,v;for(int j=1; j<=n; j++)if(!vis[j]&&maxn>d[j]){maxn=d[j];v=j;}vis[v]=1;ans+=maxn;for(int j=1; j<=n; j++)if(!vis[j]&&ma[v][j]<d[j])d[j]=ma[v][j];}return ans;
}main那里面
先输入数组ma
然后
long long ans=prim(1);printf("%lld\n",ans);

(最小生成树)prim算法相关推荐

  1. [Java学习] 最小生成树——Prim算法

    文章目录 最小生成树 Prim算法流程 应用实例 求最小生成树 最小生成树 百度百科上对于最小生成树的定义是这样的:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结 ...

  2. 最小生成树Prim算法Java版

    最小生成树Prim算法Java版 算法描述: 在一个加权连通图中,顶点集合V,边集合为E 任意选出一个点作为初始顶点,标记为visit,计算所有与之相连接的点的距离,选择距离最短的,标记visit. ...

  3. D-OJ刷题日记:使用邻接矩阵实现最小生成树Prim算法 题目编号:1135

    理解: [理解prim算法本质--让一棵小树逐渐长大] Prim算法:又称为加边法,即每次选择最小权值的边加入到生成树中,然后再更新权值,如此反复,保证每次最优来达到最优解. Prim算法生成树用的是 ...

  4. 西南科技大学OJ题 求最小生成树(Prim算法)1075

    求最小生成树(Prim算法) 1000(ms) 10000(kb) 2256 / 4495 Tags: 生成树 求出给定无向带权图的最小生成树.图的定点为字符型,权值为不超过100的整形.在提示中已经 ...

  5. 最小生成树-Prim算法详解(含全部代码)

    目录 适用条件 测试所用图 算法详解 Prim算法代码 全部代码 实验结果 适用条件 加权连通图 测试所用图 所用原图及生成过程 其中,(a) 为原图,圆圈里面是节点的名称,边上的数字是边的权值.由实 ...

  6. 最小生成树 - Prim算法

    最小生成树 - Prim算法 思路: 采用 贪心策略,每次选取连通块外延的最短边和对应的点放入连通块,再更新新的连通块外延的边.连通部分逐渐扩大,最后将整个图连通起来,并且边长之和最小. 时间复杂度: ...

  7. 【数据结构】最小生成树 Prim算法 Kruskal算法

    最小生成树应用场景: 假设以下场景,有一块木板,板上钉上一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通过一根或者多根细绳连接起来,那么一定存在这样得情况,即用最少的细绳把所有的钉子连接起 ...

  8. 生成树的概念,最小生成树Prim算法 Kruskal算法

    求解最小生成树可以用Prim算法 Kruskal算法

  9. POJ2728 Desert King ——01分数规划Dinkelbach迭代法+最小生成树prim算法

    首先,纪念我用Linux系统AC的第一题-   安装这个万恶的NOI Linux系统费了6小时的时间,不过好在最后终于装上了,但是因为我安装的Linux系统比较烂,还遭到了小花儿和js的鄙视,唉,本人 ...

  10. 图论(十)最小生成树-Prim算法

    前面说过,Prim算法是从顶点着手构建最小生成树的.应该说,Prim算法比Kruskal更简单.我们还是以前面的乡镇假设光纤网络为例: Prim算法工作步骤 (1) 构建全部顶点集V,选取初始顶点,加 ...

最新文章

  1. 学习手机游戏原画设计需要多长时间?难学吗?
  2. HMM——前向后向算法
  3. 1405 树的距离之和
  4. 【转】使用Jmeter针对ActiveMQ JMS Point To Point压力测试
  5. windows8 系统语言由中文修改为英文系统
  6. ffmpeg 转换VC工具已经可以生成工程文件
  7. 网站制作常用的cms系统有哪些?
  8. omnet++ tictoc1 实例分析
  9. 汽车操作系统的前世今生
  10. 张驰咨询:某能源公司举办首期精益六西格玛黑带项目结硕果
  11. 《缠中说禅108课》108:何谓底部?从月线看中期走势演化
  12. 泛式的extends和supper
  13. 无论你处于Java学习的哪个阶段,这些都适合你
  14. 【模拟电路】电极驱动H桥
  15. html表格图片垂直居中 css,利用Display: table;实现img图片垂直居中
  16. c++ http gzip压缩解压缩
  17. vue中import引入模块路径中@符号是什么意思
  18. Android 轻量级数据库 Hawk
  19. ECMAScript 6 基本(未完待续)
  20. 配置免密登录报错:ssh: Could not resolve hostname note1: Name or service not known

热门文章

  1. Ajax在请求数据时显示等待动画遮罩
  2. Java API概述及应用
  3. OpenStack-Mitaka 一键安装测试环境脚本
  4. SpringBoot执行器端点Actuator Endpoint
  5. 为什么MySQL索引更适合B+树而不是二叉树、B树
  6. 许昌学院计算机学院张伶俐,2019年教育科学学院毕业论文答辩工作安排
  7. 源码里没有configure_深入源码理解.NET Core中Startup的注册及运行
  8. 项目的启动顺序_多个项目进行如何做好进度管理
  9. php黄页,PHP 黄页的url
  10. js使用深度优先遍历实现getElmentById(id)