算法简介



Prim算法


普里姆算法在找最小生成树时,将顶点分为两类,一类是在查找的过程中已经包含在树中的(假设为 A 类),剩下的是另一类(假设为 B 类)。

对于给定的连通网,起始状态全部顶点都归为 B 类。在找最小生成树时,选定任意一个顶点作为起始点,并将之从 B 类移至 A 类;然后找出 B 类中到 A 类中的顶点之间权值最小的顶点,将之从 B 类移至 A 类,如此重复,直到 B 类中没有顶点为止。所走过的顶点和边就是该连通图的最小生成树。

	
//最小生成树-Prim算法 参数:图G
void Prim(Graph G)
{
	int v=0;//初始节点
	closedge C[MaxVerNum];
	int mincost = 0; //记录最小生成树的各边权值之和
	//初始化
	for (int i = 0; i < G.vexnum; i++)
	{
		C[i].adjvex = v;
		C[i].lowcost = G.Edge[v][i];
	}
	cout << "最小生成树的所有边:"<< endl;
	//初始化完毕,开始G.vexnum-1次循环
	for (int i = 1; i < G.vexnum; i++)
	{
		int k;
		int min = INF;
		//求出与集合U权值最小的点 权值为0的代表在集合U中
		for (int j = 0; j< G.vexnum; j++)
		{
			if (C[j].lowcost != 0 && C[j].lowcost< min)
			{
				min = C[j].lowcost;
				k = j;
			}
		}
		//输出选择的边并累计权值
		cout << "(" << G.Vex[k] <<","<< G.Vex[C[k].adjvex]<<") ";
		mincost += C[k].lowcost;
		//更新最小边
		for (int j = 0; j< G.vexnum; j++)
		{
			if (C[j].lowcost != 0 && G.Edge[k][j]< C[j].lowcost)
			{
				C[j].adjvex = k;
				C[j].lowcost= G.Edge[k][j];
			}
		}

	}
	cout << "最小生成树权值之和:" << mincost << endl;
}

	



可视化