#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int INF=0x3f3f3f3f;//无穷数
const int maxn=100;//最大城市数;
int guide[maxn][maxn];//邻接矩阵
int n,dis[maxn];//城市数 距当前树距离
bool vst[maxn]={false};//访问标记
int re=0;//最小花费
void prime(int x){
memset(dis, INF, sizeof(dis));
dis[x]=0;
for(int i=1;i<=n;i++){//每循环一次加入一个,共n次
int u=-1,min=INF;//新加入下标 最小花费
for(int j=1;j<=n;j++){
if(vst[j]==false&&dis[j]<=min){//小于等于更安全
u=j;
min=dis[j];
}
}
vst[u]=true;
re+=min;
for(int j=1;j<=n;j++){
int v=guide[u][j];
if(vst[j]==false&&v<dis[j]){//更新dis
dis[j]=v;
}
}
}
}
int main(){
memset(guide, INF, sizeof(guide));
cin>>n;int k;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>k;
if(k!=-1)guide[i][j]=k;
}
}
prime(1);
cout<<re<<endl;
}
/*
6
-1 6 1 5 -1 -1
6 -1 5 -1 3 -1
1 5 -1 5 6 4
5 -1 5 -1 -1 2
-1 3 6 -1 -1 6
-1 -1 4 2 6 -1
*///re=15
prim 求最小生成树(邻接矩阵)
最新推荐文章于 2023-05-22 11:23:45 发布