题目链接点击打开链接
#include <iostream>
#include<cstdio>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=1e2+10;
int sum,ral[maxn][maxn];
void Prim(int start,int n)
{
int a[maxn],lowval[maxn],pos,i,j;//a[]是标记数组,边存在lowva了
a[start]=1;
sum=0;
for(i=0; i<n; i++)
{
lowval[i]=ral[start][i];
if(i!=start)a[i]=0;
}
for(i=0; i<n-1; i++)
{
int minn=INF;
for(j=0; j<n; j++)
{
if(lowval[j]<minn&&!a[j])
{
minn=lowval[j];
pos=j;
}
}
a[pos]=1;
sum+=minn;
for(j=0; j<n; j++)
{
if(ral[pos][j]<lowval[j])
lowval[j]=ral[pos][j];
}
start=pos; //路径
}
}
int main()
{
int nodeNums;
while(~scanf("%d",&nodeNums))
{
for(int i=0; i<nodeNums; i++)
for(int j=0; j<nodeNums; j++)
{
scanf("%d",&ral[i][j]);
if(!ral[i][j])ral[i][j]=INF;//如果输入是0就是两点距离为无穷大
}
Prim(0,nodeNums);
printf("%d\n",sum);
}
}