首先回忆一下prime算法 设所有顶点的集合为v 最小生成树顶点的集合为v 没有加入到最小生成树的集合就为v-u ,起初我们任意寻找一个顶点 设为v1 我们从v1开始寻找 与v1相连的哪个顶点的的权值最小 假设v2与v1相连的权值最小 那我们把v2加入到最小生成树中 此时我们的最小生成树顶点的集合有两个元素 v1,v2 紧接着 我们寻找 剩下的顶点中 哪个顶点距离v2最近 我们把它也加入到最小生成树中 一直重复 直到u集合与v集合完全相等 最小生成树也就构造完成了 大概就是这样的思路啦 上代码!!
#include<bits/stdc++.h>
int a[100000],mp[400][400],dis[10000],book[10010];
const int inf=0x3f3f3f3f;
int n;
void prime(int x)
{
int i,j,k;
for(i=1;i<=n;i++)
dis[i]=mp[x][i];
book[x]=1;
for(i=1;i<=n;i++)
{
int minn=inf;
for(j=1;j<=n;j++)
{
if(dis[j]<minn&&!book[j])
{
minn=dis[j];
k=j;
}
}
book[k]=1;
for(j=1;j<=n;j++)
{
if(dis[j]>mp[k][j]&&!book[j])
dis[j]=mp[k][j];
}
}
}
int main()
{
int i,j,k=0;
scanf("%d",&n);
int minn=inf;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]<minn)
{
minn=a[i];//首先一定要有电才行 所以我们找一个 建发电站需要最小费用的站点 记录它 并以这个顶点为起始点开始扩展
k=i;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&mp[i][j]);
if(mp[i][j]>a[j])//如果这个值比我们在这个地方建造一个发电站的费用还要大 那就直接建造一个发电站好了
mp[i][j]=a[j];
}
}
prime(k);
int sum=0;
for(i=1;i<=n;i++)
sum+=dis[i];//求和
sum+=minn;//最初第一个发电站建造所需的费用
printf("%d\n",sum);
return 0;
}