1 #include<bits/stdc++.h>
2 using namespace std;
3 int g[101][101]; //邻接矩阵
4 int minn[101]; //minn[i]存放蓝点i与白点相连的最小边权
5 bool u[101]; //u[i]=True,表示顶点i还未加入到生成树中
6 int n,i,j;
7 int main()
8 {
9 cin >> n;
10 for (i = 1; i <= n; i++)
11 for (j = 1; j <= n; j++)
12 cin >> g[i][j];
13 memset(minn,0x7f,sizeof(minn)); //初始化为maxint
14 minn[1] = 0;
15 memset(u,1,sizeof(u)); //初始化为True,表示所有顶点为蓝点
16 for (i = 1; i <= n; i++)
17 {
18 int k = 0;
19 for (j = 1; j <= n; j++) //找一个与白点相连的权值最小的蓝点k
20 if (u[j] && (minn[j] < minn[k]))
21 k = j;
22 u[k] = false; //蓝点k加入生成树,标记为白点
23 for (j = 1; j <= n; j++) //修改与k相连的所有蓝点
24 if (u[j] && (g[k][j] < minn[j]))
25 minn[j] = g[k][j];
26 }
27 int total = 0;
28 for (i = 1; i <= n; i++) //累加权值
29 total += minn[i];
30 cout << total << endl;
31 return 0;
32 }