int prim()
{
//low数组用来保存非生成树中各顶点与生成树中顶点最短边的权值;dis数组则是你输入的数组矩阵
int ans = 0, i, j, flag, min;
//ans用来存放最小生成树的总权值
for(i = 1; i <= n; ++i)
{
low[i] = dis[1][i];//dis[1][i],选取编号为1的顶点加入最小生成树中
vis[i] = false;//数组vis,标记数组,用来表示顶点是否已加入最小生成树中。初始化为0,表示所有的点还未加入到最小生成树中
}
vis[1] = true;//编号为1的顶点加入最小生成树中
for(i = 1; i <= n; ++i)
{
min = inf;//inf为无穷大,给min初始化
flag = 1;
for(j = 1; j <= n; ++j)
{
if(min > low[j] && !vis[j])//寻找满足一个顶点未加入生成树即未被访问过的点,另一个顶点已加入生成树的最小边
{
min = low[j];
flag = j;
}
}
if(min >= inf)
{
flag = -1;
break;
}
ans += min;
vis[flag] = true;//将顶点flag加入生成树
for(j = 1; j <= n; ++j)
{
if(dis[flag][j] < low[j] && !vis[j])//更新由顶点flag到其他未加入生成树的顶点 边的权值
{
low[j] = dis[flag][j];
}
}
}
if(flag == -1) return -1;
return ans;
}
最小生成数模板
最新推荐文章于 2019-08-01 11:20:50 发布