无向图中,如果它的子图是连通图,并且是一颗树,则称其为生成树。
如果生成树的各边权值之和最小,则称其为最小生成树(MST)。
Prim算法求最小生成树:
int cost[MAX_V][MAX_V]; //边
int mincost[MAX_V]; //当前集合到该点的最短距离
bool used[MAX_V]; //标记该边是否纳入集合中
int V; //节点数
int prim()
{
for(int i=0;i<V;i++) //初始化
{
mincost[i]=INF;
used[i]=flase;
}
mincost[0]=0;//一开始只有这一个是0,其余都是INF,所以这个是最小值
int res=0;
while(true)
{
int vx=-1; //每次找边开始时先对vx初始化,使得第一次时vx就等于数组中第一个未纳入集合中的节点
for(int i=0;i<V;i++)
{
//在未纳入集合中的点中找最小边权的节点。分第一次赋值和之后赋值的情况
if(!used[i]&&(vx==-1||mincost[i]<mincost[vx])) vx=i;
}
if(vx==-1) break; //所有节点全找完
used[vx]=true;
res+=mincost[vx];