最小生成树-普里姆方法(Prim)
2016-02-21 12:38
302 查看
生成树:保留一部分的边,使图连通但无回路。
普里姆方法(Prim)步骤:
(1) 找最小边,及两个顶点为最初的树
(2) 与树相接的边中取权值最小的一条边
(3) 将边及相应顶点并入树
循环(2) (3)可得到最小生成树。
示例如下:
C代码如下:
时间复杂度为O(n^2),与顶点数有关,与边的数量无关,适用于稠密图。
普里姆方法(Prim)步骤:
(1) 找最小边,及两个顶点为最初的树
(2) 与树相接的边中取权值最小的一条边
(3) 将边及相应顶点并入树
循环(2) (3)可得到最小生成树。
示例如下:
C代码如下:
void Prim(MGraph g,int v, int &sum) { //lowcost记录树到各顶点的最小权值,vset记录顶点v是否并入树 int lowcost[maxSize], vset[maxSize]; int i, j, k, min; sum = 0; //sum用来累计树的权值 for(i = 0; i < g.n; ++i){ //lowcost、vset赋初值 lowcost[i] = g.edges[v][i]; vset[i] = 0; } vset[v] = 1; for(i = 0; i < g.n-1; ++i){ //共选出n-1条边 min = INF; //INF是一个比所有权值都大的常量 for(j = 0; j < g.n; ++j) //选树到各顶点的边的最小值 if(vset[j] == 0 && lowcost[j] < min){ min = lowcost[j]; k = j; } vset[k] = 1; //入树 sum += min; for(j = 0; j < g.n; ++j) //更新树到其他顶点的边的最小值 if(vset[j] == 0 && g.edges[k][j] < lowcost[j]) lowcost[j] = g.edges[k][j]; }//for i }//end
时间复杂度为O(n^2),与顶点数有关,与边的数量无关,适用于稠密图。
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)
- java数据结构和算法学习之汉诺塔示例