图算法之最小生成树算法(prim)
来源:互联网 发布:时间加权平均价格算法 编辑:程序博客网 时间:2024/06/07 23:56
一个图的生成树为,该生成树的点集合V等于图的点集合V,树的边E‘是图边集合E的子集,最小生成树是这些边集合的所有边的权值之和最小。
这里介绍一种求最小生成树的算法,即prim算法;这是一个贪心算法,这个算法的思想是从一个点开始,找到所有的边,将这个点到所有点的开销,也就是边的权值;利用一个数组存储所有的开销,在查找的过程中更新开销;然后每次遍历点集合,将哪些没有加入最小生成树且权重最小的点加入最小生成树;重复以上操作,直到所有的点都加入最小生成树集合。
下面是最要的算法实现:
vector<int> prim(graph *g,int start){ bool intree[MAX+1];//用于判断节点是否在最小生成树中间 edgenode *p;//临时存放节点 int distance[MAX+1];//找出下一个权值最小的边 int w;//下一个候选的点 vector<int> trees; memset(intree,false,(MAX+1)*sizeof(bool)); memset(parent,-1,sizeof(parent)); for(int i=0;i<MAX+1;i++) { distance[i]=INT_MAX; } w=start; while(!intree[w]) { intree[w]=true; p=g->nodes[w]; trees.push_back(w); while(p) { int y=p->y; if((p->weight<distance[y])&&(!intree[y])) { distance[y]=p->weight; parent[y]=w; } p=p->next; } int dis=INT_MAX; for (int i=1;i<=g->nvertex; i++) { if((distance[i]<dis)&&(!intree[i])) { dis=distance[i]; w=i; } } cout<<parent[w]<<"->"<<w<<endl; } return trees;}当然。我这里是将点的访问顺序保存在一个vector里,然后就是返回,从以上代码可以看出,我们利用一行代码观察了最小生成树的生成过程。由于以上的算法都是对于每一个点都执行了|V|次,这里时间复杂度为O(n2)。
阅读全文
0 0
- 图之 最小生成树 Prim算法
- 最小生成树算法之Prim算法
- 最小生成树算法之Prim算法
- 最小生成树算法之prim算法
- 图之最小生成树-Prim算法和Kruskal算法
- 图算法之最小生成树算法(prim)
- 最小生成树之Prim算法
- 最小生成树算法之prim
- 最小生成树之prim算法
- 【算法】最小生成树之prim
- 最小生成树之prim算法
- 最小生成树算法之Prim
- 最小生成树之prim算法
- 最小生成树之prim算法
- 最小生成树之prim算法
- 最小生成树之prim算法
- 最小生成树之prim算法
- 最小生成树之prim算法
- gulp——用自动化构建工具增强你的工作流程
- Faliure [INSTALL_FAILED_ALREADY_EXISTS] 解决办法 Android csdn
- c#:RadioButton控件与CheckBox控件的用法
- jsp页面中Unknown tag (c:forEach) 未知的标签
- Android studio gradle两种更新方法
- 图算法之最小生成树算法(prim)
- 集群、负载均衡、分布式
- 多线程基础学习十四:ReadWriteLock与ReentrantReadWriteLock
- ES6学习之路10----Symbol
- Linux SQLPLUS
- Python基础-不要对实例属性和类属性使用相同的名字
- 《剑指offer》刷题笔记(知识迁移能力):左旋转字符串
- Java反射机制
- 日志系列之WEB应用中使用Log4j2