prim算法
作者:
丶123
,
2021-10-03 21:46:51
,
所有人可见
,
阅读 320
prim算法与dijkstra算法大相径庭,唯一区别就是d数组的含义不同
S:已访问集合
prim中d数组含义:未访问顶点v到集合S的最短距离
dijkstra中d数组含义:未访问顶点v到起始点start的最短距离
体现在代码上的区别就是,用中介点u去更新距离的差异:
伪代码:
1. 初始化
2. for n次循环
找到未访问节点中d[u]最小的节点;
将u加入到集合S,并加入到生成树中
用中介点u更新未访问节点
代码:
void prim(int s)
{
fill(d,d+N,INF);
d[s] = 0;
for(int i=0;i<n;i++)
{
int u = -1 , MIN = INF;
for(int j=1;j<=n;j++)
{
if(vis[j] == false && d[j] < MIN)
{
u = j;
MIN = d[j];
}
}
if(u == -1) return; //说明剩余点与集合S不连通,没有生成树
ans += d[u]; //这里求生成树边权,如果要求出生成树,修改这里
for(int v=1;v<=n;v++)
{
if(vis[v] == false && G[u][v] < d[v)
{
d[v] = G[u][v];
}
}
}
}