借用一张图片说明:
code:
#include <iostream>
using namespace std;
#define MAX 1000
int map[MAX][MAX]; // 邻接矩阵
int dis[MAX]; // 用来保存每一个到c的距离
int visit[MAX]; // 是否访问
#define inf 110000
int n;
void prime(int u) //从u开始找
{
int i,j,sum=0;
for(i=1;i<=n;i++)
{
visit[i]=0; // 现将所有的标记为0,表示未访问
dis[i]=inf; // 距离都表示无穷大
}
dis[u]=0; // 自己到自己的距离为0
for(i=1;i<=n;i++){ //表示为n个点的比较次数
int min=inf,c=u;
for(j=1;j<=n;j++) // 找c到n个点距离最小值,且点要未访问过
if(!visit[j] && dis[j]<min)
{
min=dis[j]; //更改最小值
c=j; //标记所在的位置
}
sum+=min; //将最小的值加起来
visit[c]=1; // 并标记已访问过
for(j=1;j<=n;j++) // 将c点到n个点的距离放到dis数组中
if(!visit[j] && map[c][j]<dis[j])
dis[j]=map[c][j];
}
cout<<sum<<endl;
}
int main()
{
int i,j,e;
while(cin>>n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cin>>e;
if(e)
map[i][j]=e;
else
map[i][j]=inf;// 为0表示不能到达 用无穷大表示
}
prime(1);
}
return 0;
}