博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Prim算法
阅读量:5094 次
发布时间:2019-06-13

本文共 1832 字,大约阅读时间需要 6 分钟。

多么痛的领悟!

不要认为Prim不常见就用不到!

和Kruskal一样,Prim算法也是用来求MST的,也是体现了贪心的思想。

不同的是,Kruskal是针对边而言的,Prim是针对点而言的。Kruskal适用于稀疏图,Prim适用于稠密图,更值得一提的是,Prim可以不必保存每条边。

算法思想是,设定两个集合Vnew和Enew,先选中一个起点加入到Vnew中,再从V-Vnew(在V中且不在Vnew中)中选择一个点,使得该点到Vnew中某个点的边权最小,将这条边加入Enew中,将这个点加入Vnew中,不断重复该过程,直到Vnew=V。

因为每次是通过某个点到已建好的树的最小边权将该点加入到生成树中的,所以最终构造出来的一定是最小生成树。

1 vis[1] = 1; //开始先将起点加入到Vnew 2 for (int i = 2; i <= n; ++i) minw[i] = G[i][1]; 3 int index, mmin; 4 for (int i = 1; i < n; ++i) { 5     mmin = 1e5 + 5; 6     for (int j = 1; j <= n; ++j) //取出到Vnew中某个点边权最小的点 7         if (!vis[j] && minw[j] < mmin) index = j, mmin = minw[j]; 8     vis[index] = 1; 9     ans += mmin;10     for (int j = 1; j <= n; ++j) //用每次新加入的点更新其他点到Vnew中点的最小边权11         if(!vis[j] && G[j][index] < minw[j]) minw[j] = G[j][index];12 }
Prim算法(无优化)

 

对于Prim的初始化,还有一种写法。开始时并没有标记起点,而是将起点到Vnew中某个点的最小边权置为0,这样就需要循环n次(相当于需要将n个点放入Vnew中)。

另外,Prim还可以使用堆进行优化。自己尝试写了一个,因为是对于完全图,存图是用邻接矩阵,所以效率并没有明显提高(甚至下降)。另外,不得不说,Prim和Dijkstra太像了!

1 #include 
2 #include
3 4 using namespace std; 5 6 int dist[maxn], vis[maxn], ans = 0; 7 8 struct node { 9 int id, dist;10 node(int i, int d) : id(i), dist(d) {}11 bool operator < (const node& rhs) const {12 return dist > rhs.dist;13 }14 };15 16 priority_queue
q;17 18 memset(dist, 0x3f3f3f3f, sizeof(dist));19 dist[1] = 0;20 q.push(node(1, 0));21 while (!q.empty()) {22 int u = q.top().id;23 q.pop();24 if (vis[u]) continue;25 vis[u] = 1;26 ans += dist[u];27 for (int v = 1; v <= n; ++v) { //这里是针对完全图,用的邻接矩阵28 if (v == u) continue; //改成邻接链表也可以29 if (dist[v] > dis(u, v)) {30 dist[v] = dis(u, v);31 q.push(node(v, dist[v]));32 }33 }34 }
Prim算法(堆优化)

 

转载于:https://www.cnblogs.com/Mr94Kevin/p/9575611.html

你可能感兴趣的文章
转:Spring源码分析:IOC容器
查看>>
Hdu1575Tr A矩阵
查看>>
题解-Codeforces917D Stranger Trees
查看>>
关于用phonegap+jquery moblie开发 白屏闪屏的解决方法
查看>>
Vimdiff 使用
查看>>
实验8 编写程序,输出一张九九乘法口诀表。要求必须将乘积放入一个二维数组中,再输出该数组,程序运行效果如下...
查看>>
skynet启动过程_1
查看>>
.Net_06_创建存储过程的基本语法(Sql 语句)
查看>>
Unity3d Attribute 总结
查看>>
Visual C++学习杂谈2(constexpr变量、const与auto,using/typedef类型别名)
查看>>
CSS 基础知识(认识选择器)
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
Android Token的使用学习
查看>>
小别离
查看>>
★一张图弄明白从零维到十维
查看>>
Makefile 跟着走快点
查看>>
Java开发学习心得(一):SSM环境搭建
查看>>
固定渲染管线与可编程渲染管线的区别
查看>>
MVC框架
查看>>
IIS在默认情况并不支持对PUT和DELETE请求的支持
查看>>