下面是最小生成树prim算法的模板,个人觉得需要注意的是,dis初始化的时候,要初始化为很大的值。
int prim() //复杂度O(N^2)
{
int result = 0;
int minCost;
int i,j,k;
lowCost[0] = -1; //从结点0开始
for(i = 1; i< n; i++)
lowCost[i] = graph[0][i];
for(i = 1; i < n; i++) //找n-1条边
{
minCost = MAX;
for(j = 1; j < n; j++) //找两个不想交集合的最小边
{
if(lowCost[j]>0 && lowCost[j]<minCost)
{
minCost = lowCost[j];
k = j;
}
}
lowCost[k] = -1; //找到,标记
result += minCost;
for(j = 1; j < n; j++) //加入这个结点后,更新两个集合的边。
{
if(graph[k][j] < lowCost[j])
lowCost[j] = graph[k][j];
}
}
return result;
}
void prim()
{
int i, j, now, min_node, min_edge;
for(i = 1; i <= n; i ++)
dis[i] = inf;
now = 1;
ans = 0;
for(i = 1; i < n; i ++)
{
dis[now] = -1;
min_edge = inf;
for(j = 1; j <= n; j ++)
if(now != j && dis[j] >= 0)
{
dis[j] = min(dis[j], map[now][j]);
if(dis[j] < min_edge)
{
min_edge = dis[j];
min_node = j;
}
}
now = min_node;
ans += min_edge;
}
}