#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, w, num = 0, head[100010], fa[1010];
struct Edge {
int u, v, w, next;
} edge[100010];
void add(int u, int v, int w) {
num ++;
edge[num].u = u;
edge[num].v = v;
edge[num].w = w;
edge[num].next = head[u];
head[u] = num;
}
int find(int x) {
if(fa[x] == x) return x;
return fa[x] = find(fa[x]);
}
bool cmp(const Edge &a, const Edge &b) {
return a.w < b.w;
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++) {
scanf("%d", &w);
if(w) add(i, j, w);
}
for(int i = 1; i <= n; i ++) fa[i] = i;
sort(edge + 1, edge + num + 1, cmp);
int sum = 0, tot = 0;
for(int i = 1; i <= num; i ++) {
int p1 = find(edge[i].u);
int p2 = find(edge[i].v);
if(p1 == p2) continue;
fa[p1] = p2;
tot ++; sum += edge[i].w;
if(tot == n - 1) break;
}
printf("%d", sum);
return 0;
}
【NOIP模板】 最小生成树 kruskal
最新推荐文章于 2021-10-14 12:50:11 发布