【NOIP模板】 最小生成树 kruskal

来源:互联网 发布:java贪吃蛇源代码下载 编辑:程序博客网 时间:2024/06/09 16:55
#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;}