前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【小码匠自习室】最小生成树(kruskal)完结撒花

【小码匠自习室】最小生成树(kruskal)完结撒花

作者头像
小码匠
发布2023-03-06 14:31:17
2260
发布2023-03-06 14:31:17
举报
文章被收录于专栏:小码匠和老码农

最小生成树

  • Prim:算法思路OK,但没刷对应的题目
  • kruskal:打了几个板子题目

今晚上有手撸了下板子代码,使用优先队列做了优化,提交上去,性能提升不明显,有些小郁闷。。。

明天打算开始先学习强连通【Tarjan】,把这些基础算法学完了,在强化刷题。

题目

  • P1546 [USACO3.1]最短网络 Agri-Net
    • https://www.luogu.com.cn/problem/P1546

小码匠

代码
代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;
#define endl '\n';

struct edge {
    int weight;
    int from;
    int to;
};

struct cmp {
    bool operator() (const edge &a, const edge &b) {
        return a.weight > b.weight;
    }
};

struct UF {
    vector<int> fa;

    UF (int n) :
        fa(n) {}

    void initialize (int n) {
        for (int i = 0; i < n; ++i) {
            fa[i] = i;
        }
    }

    int find(int a) {
        if (a != fa[a]) {
            fa[a] = find(fa[a]);
        }
        return fa[a];
    }

    void unite(int x, int y) {
        int a = find(x);
        int b = find(y);
        if (a != b) {
            fa[b] = a;
        }
    }

    bool is_same(int x, int y) {
        return find(x) == find(y);
    }
};

void best_coder() {
    int n;
    cin >> n;
    priority_queue <edge, vector<edge>, cmp> g;
    UF uf(n);
    uf.initialize(n);
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            int a;
            cin >> a;
            if (j <= i) {
                continue;
            }
            g.push({a, i, j});
        }
    }
    int ans = 0;
    while (!g.empty()) {
        int a = g.top().from;
        int b = g.top().to;
        if (uf.is_same(a, b)) {
            g.pop();
            continue;
        }
        uf.unite(a, b);
        ans += g.top().weight;
        g.pop();
    }
    cout << ans;
}

void happy_coder() {
}

int main() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    // 小码匠
    best_coder();

    // 最优解
    // happy_coder();

    // 返回
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小码匠和老码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 最小生成树
  • 题目
  • 小码匠
    • 代码
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档