基本思想
“连接一个 最小生成树的子图与外界的最小边一定是最小生成树中的边”
每一次循环加入一个点,这个新点与旧点集相连的边的权值最小。
具体解释看下面
代码实现
#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;
}
希望多多指教!