伪代码
1.初始化辅助数组SHORTEDGE [N];
2.输出顶点V0,将顶点0加入集合ù中;
3.重复执行下列操作的N-1次
3.1再shortEdge [n] .lowcost中选取最短边及对应的邻接点编号k;
3.2输出顶点k和对应的权值;
3.3将顶点k加入集合U中
3.4调整数组shortEdge [n];
v
的#include <iostream的> #define MaxSize 100 #define INF 0x3f3f3f3f 使用namespace std; 结构图 { int vertex [MaxSize]; int arc [MaxSize] [MaxSize]; int vertexNum; int arcNum; } G; / ** <初始图G * / void creatGraph() { int i,j,k,w; //初始化图ģ COUT << “请依次输入图的顶点数,边数及各边的三个数据” << ENDL; CIN >> G.vertexNum >> G.arcNum; for(i = 0; i <G.vertexNum; i ++) for(j = 0; j <G.vertexNum; j ++) { G.arc [i] [j] = INF; } for(i = 0; i <G.vertexNum; i ++) { G.vertex [I] = I; } for(i = 0; i <G.arcNum; i ++) { CIN >> J >> K >>瓦特; G.arc [J] [K] = W; //无向图 G.arc [K] [j] =瓦特; } } //定义声明候选最短边集SHORTEDGE 结构边缘 { int lowcost; //该点与另一个集合各点相连比较之下最小权的权 int adjvex; //该点与另一个集合有最小权的点的位置 }; 结构边缘shortEdge [MaxSize]; int minEdge(struct edge * shortEdge,int n) { int i,j,t; for(i = 0; i <n; i ++) { 如果(SHORTEDGE [I] .lowcost!= 0) { T = 1; 打破; } } for(i = 0; i <n; i ++) { 如果(SHORTEDGE [I] .lowcost <SHORTEDGE [T] .lowcost && SHORTEDGE [I] .lowcost!= 0) { T = 1; } } 返回t; } void prim(图G) { int i,j,k; //初始化辅助数组(候选最短边集数组) for(i = 1; i <G.vertexNum; i ++) { SHORTEDGE [I] .lowcost = G.arc [0] [I]; SHORTEDGE [I] .adjvex = 0; } SHORTEDGE [0] .lowcost = 0; //将顶点0加入集合ù for(i = 0; i <G.vertexNum-1; i ++) { K = minEdge(SHORTEDGE,G.vertexNum); //找到最短边的紫外线中的邻接点 cout <<“(”<< k <<“,”<< shortEdge [k] .adjvex <<“)”<<':'<< shortEdge [k] .lowcost <<''; SHORTEDGE [K] .lowcost = 0; //调整SHORTEDGE数组 for(j = 1; j <G.vertexNum; j ++) { //主要是比较新加入的,以前加入的都比较过了,现在的低成本已经是他们中最小的权了 如果(G.arc [K] [j]的<SHORTEDGE [j]的.lowcost) { SHORTEDGE [j]的.lowcost = G.arc [k]的[D]; SHORTEDGE [j]的.adjvex = K; } } } } int main() { creatGraph(); 整洁(G); 返回0; }
样例:
输入:
6 9
0 1 34
1 4 12
0 5 19
4 5 26
0 2 46
2 5 25
3 5 25
4 5 26
2 3 17
输出:
(5,0):19(2,5):25(3,2):17(4,5):26(1,4):12
下面奉上普里姆的详细定义