#include using namespace std; const int N = 110; const int M = 10010; struct Node { //用结构体存储每条边 int f, t, w; bool operator<(const Node &e) const { return w < e.w; } } edges[M]; int p[N]; int find(int x) { //并查集找根节点 if (p[x] != x) p[x] = find(p[x]); return p[x]; } int n, idx, ans; int main() { scanf("%d", &n); //邻接矩阵 for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) { int w; scanf("%d", &w); edges[idx++] = {i, j, w}; //加入当前的边 } sort(edges, edges + idx); //对边权进行排序,注意这里不是优先队列,是谁小谁在前 for (int i = 1; i <= n; i++) p[i] = i; //并查集初始化 for (int i = 1; i <= idx; i++) { //枚举每条边 int f = find(edges[i].f), t = find(edges[i].t); if (f != t) { //当前两点不连通 ans += edges[i].w; //更新答案 p[f] = t; //让两点变连通 } } printf("%d", ans); return 0; }