普里姆最小生成树算法
存在连通图 G(V, E),且给出了每条边的权重或开销。普里姆算法将找到图 G 中的最小生成树。
这是一种渐长树算法。此算法需要一个种子值来启动树。种子顶点发展为形成整棵树。

此问题将使用两组求解。一组包含已选择的节点,而另一组则包含尚未考虑的项目。它从种子顶点出发,基于最小边开销获取相邻顶点,从而通过一个一个地获取节点来发展树。
此问题的算法时间复杂度为 O(V^2)。这里V是顶点数。
输入输出
Input: The adjacency list:Output: (0)---(1|1) (0)---(2|3) (0)---(3|4) (1)---(0|1) (1)---(4|2) (2)---(0|3) (3)---(0|4) (4)---(1|2) (4)---(5|2) (5)---(4|2) (5)---(6|3) (6)---(5|3)
算法
prims(g: Graph, t: tree, start)
输入 − 图g、空树和名为“start” 的种子顶点
输出 − 添加边之后的树。
Begin define two sets as usedVert, unusedVert usedVert[0] := start and unusedVert[0] := φ for all vertices except start do usedVert[i] := φ unusedVert[i] := i //add all vertices in unused list done while number of vertices in usedVert ≠ V do //V is number of total nodes min := ∞ for all vertices of usedVert array do for all vertices of the graph do if min > cost[i,j] AND i ≠ j then min := cost[i,j] ed := edge between i and j, and cost of ed := min done done unusedVert[destination of ed] := φ add edge ed into the tree t add source of ed into usedVert done End
示例
#include<iostream>
#define V 7
#define INF 999
using namespace std;
//Cost matrix of the graph
int costMat[V][V] = {
{0, 1, 3, 4, INF, 5, INF},
{1, 0, INF, 7, 2, INF, INF},
{3, INF, 0, INF, 8, INF, INF},
{4, 7, INF, 0, INF, INF, INF},
{INF, 2, 8, INF, 0, 2, 4},
{5, INF, INF, INF, 2, 0, 3},
{INF, INF, INF, INF, 4, 3, 0}
};
typedef struct {
int u, v, cost;
}edge;
class Tree {
int n;
edge edges[V-1]; //as a tree has vertex-1 edges
public:
Tree() {
n = 0;
}
void addEdge(edge e) {
edges[n] = e; //add edge e into the tree
n++;
}
void printEdges() { //print edge, cost and total cost
int tCost = 0;
for(int i = 0; i<n; i++) {
cout << "Edge: " << char(edges[i].u+'A') << "--" << char(edges[i].v+'A');
cout << " And Cost: " << edges[i].cost << endl;
tCost += edges[i].cost;
}
cout << "Total Cost: " << tCost << endl;
}
friend void prims(Tree &tre, int start);
};
void prims(Tree &tr, int start) {
int usedVert[V], unusedVert[V];
int i, j, min, p;
edge ed;
//initialize
usedVert[0] = start; p = 1;
unusedVert[0] = -1; //-1 indicates the place is empty
for(i = 1; i<V; i++) {
usedVert[i] = -1; //all places except first is empty
unusedVert[i] = i; //fill with vertices
}
tr.n = 0;
//get edges and add to tree
while(p != V) { //p is number of vertices in usedVert array
min = INF;
for(i = 0; i<p; i++) {
for(j = 0; j<V; j++) {
if(unusedVert[j] != -1) {
if(min > costMat[i][j] && costMat[i][j] != 0) {
//find the edge with minimum cost
//such that u is considered and v is not considered yet
min = costMat[i][j];
ed.u = i; ed.v = j; ed.cost = min;
}
}
}
}
unusedVert[ed.v] = -1; //delete v from unusedVertex
tr.addEdge(ed);
usedVert[p] = ed.u; p++; //add u to usedVertex
}
}
main() {
Tree tr;
prims(tr, 0); //starting node 0
tr.printEdges();
}输出
(0)---(1|1) (0)---(2|3) (0)---(3|4) (1)---(0|1) (1)---(4|2) (2)---(0|3) (3)---(0|4) (4)---(1|2) (4)---(5|2) (5)---(4|2) (5)---(6|3) (6)---(5|3)
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP
Output:
(0)---(1|1) (0)---(2|3) (0)---(3|4)
(1)---(0|1) (1)---(4|2)
(2)---(0|3)
(3)---(0|4)
(4)---(1|2) (4)---(5|2)
(5)---(4|2) (5)---(6|3)
(6)---(5|3)