Prim算法是从某个顶点出发,然后不断添加边的算法。

首先,我们假设有一颗只包含一个顶点v的树T。然后贪心地选取T和其他顶之间相连的最小权值的边,并把它加到T中。不断进行这个操作,就可以得到一颗生成树了。这样得到的就是最小生成树。

code:

#include <cstdio>
#include <algorithm>

using namespace std;
const int MAX_V = 1000+7;
const int INF = 0x3f3f3f3f; // 一个极大值,可以理解为无穷大

// X是已求得的生成树的顶点的集合
int cost[MAX_V][MAX_V]; // cost[u][v]表示边u->v的权值(不存在设为INF)
int mincost[MAX_V];     // 从集合X出发的边到每个顶点的最小权值
bool used[MAX_V];       // 顶点i是否包含在集合X中,即是否已经使用过
int V;                  // 顶点的个数

int prim()
{
    for(int i = 0; i < V; i++)  // 初始化操作
    {
        mincost[i] = INF;
        used[i] = false;
    }
    mincost[0] = 0;     // 我们从0这个顶点开始,在下面的操作中
    int result = 0;
    
    while(1)
    {
        int v = -1;
        for(int u = 0; u < V; u++)  // 从不属于X的顶点中选取从X到其权值最小的顶点
        {
            if( !used[u] && (v == -1 || mincost[u] < mincost[v]))
                v = u;
        }
        if(v == -1) break;      // 已经没有点可以选了
        used[v] = true;          // 把顶点v加入到X,v这个点已经选取过了
        result += mincost[v];   // 把边的长度加入到结果中
        for(int u = 0; u < V; u++)  // 更新集合X到其他顶点的最小距离,集合内每多一个点都要更新一次
            mincost[u] = min(mincost[u], cost[v][u]);   // 比较的是原来的最短距离和新的可能的最短距离
            
    }
    return result;
}

int main()
{




    return 0;
}