定义
prim算法,图论中的一种算法,可在加权连通图里搜索最小生成树。 由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,并且其所有边的权值之和最小。
算法描述
①输入:一个加权连通图,其中顶点集合为V,边集合为E;
②初始化 :Vnew={x},其中x为集合V中的任意节点(起始点),Enew={}为空。
③重复下列操作,直到Vnew=V;
a.在集合E中选取权值最小的边<u,v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
b.将v加入集合Vnew中,将<u,v>边加入集合Enew中
④输出:使用集合Vnew和Enew来描述所得到的最小生成树
代码
#define MAXN 1000
#define INF 1<<30
int closest[MAXN],lowcost[MAXN],m;//m为节点的个数
int G[MAXN][MAXN];//邻接矩阵
int prim()
{
for(int i=0;i<m;i++)
{
lowcost[i] = INF;
}
for(int i=0;i<m;i++)
{
closest[i] = 0;
}
closest[0] = -1;//加入第一个点,-1表示该点在集合U中,否则在集合V中
int num = 0,ans = 0,e = 0;//e为最新加入集合的点
while (num < m-1)//加入m-1条边
{
int micost = INF,miedge = -1;
for(int i=0;i<m;i++)
if(closest[i] != -1)
{
int temp = G[e][i];
if(temp < lowcost[i])
{
lowcost[i] = temp;
closest[i] = e;
}
if(lowcost[i] < micost)
micost = lowcost[miedge=i];
}
ans += micost;
closest[e = miedge] = -1;
num++;
}
return ans;
}