#include <cstdio> #include <cstdlib> const int MAXN = 50; // 最大顶点数 const int INF = 1000000000; // 作为标记的无穷大值 int mat[MAXN][MAXN]; // 无向图的邻接矩阵 int mind[MAXN]; // 辅助数组 int v[MAXN]; // 标记顶点是否被访问过的数组 int n; // 顶点的个数 int prim() { int ret = 0, i, j, k; for (i = 0; i<n; i++) { mind[i] = INF; v[i] = 0; } for (mind[j = 0] = 0; j < n; j++) { for (k = -1, i = 0; i < n; i++) { if (!v[i] && (k == -1 || mind[i] < mind[k])) { k = i; } } v[k] = 1; ret += mind[k]; for (i = 0; i < n; i++) { if (!v[i] && mat[k][i] < mind[i]) { mind[i] = mat[k][i]; } } } return ret; } int main() { scanf("%d", &n); for (int i = 0;i < n;i++) { // 读入无向图的邻接矩阵 for (int j = 0;j < n;j++) { scanf("%d", &mat[i][j]); if (mat[i][j] == 0) mat[i][j] = INF; } } printf("%d\n", prim()); return 0; } /************************************************************** Problem: 2162 User: admin Language: C++ Result: Accepted Time:8 ms Memory:1156 kb ****************************************************************/