基本思想
“连接一个 最小生成树的子图与外界的最小边一定是最小生成树中的边”
每一次循环加入一个点,这个新点与旧点集相连的边的权值最小。
具体解释看下面
代码实现
#include<bits/stdc++.h>
using namespace std;
int n,lowcost[10000];
int cost[10000][10000];
int mincost,minn,k;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>cost[i][j];//表示第i点与第j点的直接距离
for(int i=1;i<=n;i++)
{
lowcost[i]=cost[1][i];//lowcost[i]是每个点与旧点集(所有已经判断过了的点生成的连通块)的最短距离,现在这个点集里只有点1,所以将其赋为"cost[1][i]"
}
for(int i=1;i<n;i++)**//枚举除点1外的n-1个点**
{
minn=10000000;
for(int j=1;j<=n;j++)
{
if((minn>lowcost[j])&&lowcost[j]!=0)// !=0表示这个点未判断过;
minn=lowcost[j];//求出集外点到点集边的最小权值
k=j;//记录这个点j
}
mincost+=minn;
lowcost[k]=0;//标记已经判断过
for(int j=1;j<=n;j++)
{
if(cost[k][j]<lowcost[j])
lowcost[j]=cost[k][j];//更新:因为点集中加入了新点k,所以需要更新点到点集的最短距离
}
}
cout<<mincost;
return 0;
}
希望多多指教!
本文深入探讨了最小生成树算法的基本思想与实现过程,通过逐步加入权重最小的边来构建最小生成树,确保每次新增的边连接的是当前树与外界的最小权值路径。文章详细解释了算法的每一步,并提供了C++代码实现,帮助读者理解算法细节。
322

被折叠的 条评论
为什么被折叠?



