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;
}