算法分类:
贪心
算法原理:
1. 在图G=(V, E) (V表示顶点 ,E表示边)中,从集合V中任取一个顶点(例如取顶点v0)放入集合 U中,这时 U={v0},集合T(E)为空。
2. 从v0出发寻找与U中顶点相邻(另一顶点在V中)权值最小的边的另一顶点v1,并使v1加入U。即U={v0,v1 },同时将该边加入集合T(E)中。
3. 重复2,直到U=V为止。
这时T(E)中有n-1条边,T = (U, T(E))就是一棵最小生成树。
算法时空复杂度:
O(n平方)
代码实现:
#define MAX 2147483647
#define ARRAYSIZE ?
int dist[ARRAYSIZE];
int G[ARRAYSIZE][ARRAYSIZE];
bool vis[ARRAYSIZE];
int path[ARRAYSIZE]; // 记录最小生成树的连接情况
int prim(int src, int n)
{
int i, v, w, min;
/* 记录最小生成树总长度 */
int length = 0;
memset(vis, false, sizeof(vis));
/* 各点距离初始化 */
for (i = 1; i <= n; ++i) {
dist[i] = G[src][i];
path[i] = src;
}
dist[src] = 0;
vis[src] = true;
for (i = 1; i < n; ++i)
{
min = MAX;
for (w = 1; w <= n; ++w)
if (!vis[w] && min > dist[w])
{
v = w;
min = dist[w];
}
/* 将找到的最近点加入最小生成树 */
vis[v] = true;
length += min;
for (w = 1; w <= n; ++w)
{
/* 修正其他点到最小生成树的距离 */
if (!vis[w] && G[v][w] < dist[w]) {
dist[w] = G[v][w];
path[i] = v;
}
}
}
return length;
}