太久没写最小生成树了,快忘光了。这几天回顾了一下

  • 最小生成树一·Prim算法

    AC G++ 369ms 17MB
    #include "cstdio"
    using namespace std;
    const int INF = 0x3f3f3f3f;
    int road[][];
    int dis[], n, ans;
    bool vis[];
    void prim() {
    int v, mn;
    for (int i = ; i <= n; i++) {
    dis[i] = road[][i];
    }
    vis[] = true;
    for (int i = ; i < n; i++) {
    mn = INF;
    for (int j = ; j <= n; j++) {
    if (!vis[j] && dis[j] < mn) {
    mn = dis[j];
    v = j;
    }
    }
    ans += dis[v];
    vis[v] = true;
    for (int j = ; j <= n; j++) {
    if (!vis[j] && dis[j] > road[v][j]) {
    dis[j] = road[v][j];
    }
    /*
    这个if改成如下写法就变成Dijkstra算法求最短路了
    if (!vis[j] && dis[j] > dis[v] + road[v][j]) {
    dis[j] = dis[v] + road[v][j];
    }
    */
    }
    }
    }
    int main() {
    scanf("%d", &n);
    for (int i = ; i <= n; i++) {
    for (int j = ; j <= n; j++) {
    scanf("%d", &road[i][j]);
    }
    }
    prim();
    printf("%d\n", ans);
    return ;
    }

    理解了Dijkstra看这个就很容易了,改一下if语句多加一个ans就是了;

  • 最小生成树二·Kruscal算法
    AC G++ 342ms 17MB
    #include "bits/stdc++.h"
    using namespace std;
    typedef long long LL;
    const int INF = 0x3f3f3f3f;
    // 并查集
    int pre[];
    struct Road{
    int s, e, v;
    }road[];
    bool cmp(Road n, Road m) {
    return n.v < m.v;
    }
    int find(int id) {
    if (pre[id] == ) {
    return id;
    }
    return pre[id] = find(pre[id]);
    }
    int main() {
    int n, m, ans = ;
    scanf("%d%d", &n, &m);
    for (int i = ; i < m; i++) {
    scanf("%d%d%d", &road[i].s, &road[i].e, &road[i].v);
    }
    sort (road, road + m, cmp);
    // 用n - 1条边可以联通n个点,所以当n == 1的时候退出循环
    for (int i = ; n != ; i++) {
    int s = find(road[i].s);
    int e = find(road[i].e);
    if (s != e) {
    pre[s] = e;
    n--;
    ans += road[i].v;
    }
    }
    printf("%d\n", ans);
    return ;
    }

    Kruscal算法有点贪心的意思在里面吧,每次取最短的边,当n个点被联通时退出循环

  • 最小生成树三·堆优化的Prim算法
    AC G++ 436ms 24MB
    #include "bits/stdc++.h"
    using namespace std;
    typedef long long LL;
    typedef pair<int, int> PII;
    const int INF = 0x3f3f3f3f;
    const int MAXN = 1e5 + ;
    /*
    road[i].first 存放以i为顶点的边的另一个顶点
    road[i].second 存放以i为顶点的边的长度
    */
    vector<PII> road[MAXN];
    int dis[MAXN];
    int ans;
    bool vis[MAXN];
    void prim() {
    // q表示就目前状态可以花费q.top.first的代价去联通q.top.second这个点
    priority_queue<PII, vector<PII>, greater<PII> > q;
    memset(dis, INF, sizeof(dis));
    q.push({, });
    while (!q.empty()) {
    int id = q.top().second;
    if (vis[id]) {
    // 如果id已经被联通,直接continue
    q.pop();
    continue;
    } else {
    // 否则由于优先列队的排序,q.top.first一定是最小代价
    ans += q.top().first;
    q.pop();
    }
    vis[id] = true;
    for (auto i : road[id]) {
    if (i.second < dis[i.first]) {
    dis[i.first] = i.second;
    q.push({i.second, i.first});
    }
    }
    }
    }
    int main() {
    int n, m;
    int u, v, w;
    scanf("%d%d", &n, &m);
    while (m--) {
    scanf("%d%d%d", &u, &v, &w);
    road[u].push_back({v, w});
    road[v].push_back({u, w});
    }
    prim();
    printf("%d\n", ans);
    return ;
    }

    果然还是和dijkstra很像啊,仿照dijkstra的堆优化就好了。这种建图的方法倒是比原先用的链式前向星好写多了。

最小生成树 HihoCoder-1097、1098、1109(最小生成树算法)的更多相关文章

  1. MST最小生成树及Prim普鲁姆算法

    MST在前面学习了Kruskal算法,还有一种算法叫做Prim的.这两者的区别是Prim算法适合稠密图,比如说鸟巢这种几乎所有点都有相连的图.其时间复杂度为O(n^2),其时间复杂度与边的数目无关:而 ...

  2. 【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题

    在这一专辑(最小生成树)中的上一期讲到了prim算法,但是prim算法比较难懂,为了避免看不懂,就先用kruskal算法写题吧,下面将会将三道例题,加一道变形,以及一道大水题,水到不用高级数据结构,建 ...

  3. 【数据结构】最小生成树之prim算法和kruskal算法

    在日常生活中解决问题经常需要考虑最优的问题,而最小生成树就是其中的一种.看了很多博客,先总结如下,只需要您20分钟的时间,就能完全理解. 比如:有四个村庄要修四条路,让村子能两两联系起来,这时就有最优 ...

  4. 最小生成树——Kruskal(克鲁斯卡尔)算法

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 Kruskal(克鲁斯卡尔)算法 的idea 并用 源代码加以实现: 0.2)最小生成树的基础知识,参见 ...

  5. hiho一下 第二十九周 最小生成树三·堆优化的Prim算法【14年寒假弄了好长时间没搞懂的prim优化:prim算法+堆优化 】

    题目1 : 最小生成树三·堆优化的Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 回到两个星期之前,在成功的使用Kruscal算法解决了问题之后,小Ho产生 ...

  6. hihocoder 1097 最小生成树一·Prim算法

    #1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可 ...

  7. hihoCoder#1109 最小生成树三·堆优化的Prim算法

    原题地址 坑了我好久...提交总是WA,找了个AC代码,然后做同步随机数据diff测试,结果发现数据量小的时候,测试几十万组随机数据都没问题,但是数据量大了以后就会不同,思前想后就是不知道算法写得有什 ...

  8. HihoCoder 1097 Prim算法

    1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以 ...

  9. 最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)

    最小生成树的性质 MST性质:设G = (V,E)是连通带权图,U是V的真子集.如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最 ...

随机推荐

  1. Java 面向对象异常处理,finally,覆盖时异常特点,package,import,包之间的访问(10)

    Java 面向对象异常处理, finally:final 关键字的用法参考http://www.cnblogs.com/itcqx/p/5541659.html 覆盖时异常特点,package,imp ...

  2. 关于luoguU67856 数列一题

    本题采用累加法 首先这个式子\[a_n = ka_{n-1}+b\]的通项不用我说了吧 然后就是累加法 \[S_n = \sum_{i=1}^{n} a_i = \sum_{i=1}^{n} ka_{ ...

  3. DOCKER 学习笔记2 认识dockerfile自定义镜像

    Dockerfile 概念 Dockerfile 是一个文本文件,但包含所构建容器在运行时候的参数.库.资源配置.可以简单理解为我们现有的镜像,比如Centos/Nginx 但我们需要构建一个容器的时 ...

  4. Web前端学习方向

    第一部分 HTML 第一章 职业规划和前景 职业方向规划定位: web前端开发工程师 web网站架构师 自己创业 转岗管理或其他 web前端开发的前景展望: 未来IT行业企业需求最多的人才 结合最新的 ...

  5. goweb-go语言基础

    go语言基础 虽然这本书是讲goweb,但还是吧go语言基础过了一遍,由于我之前已经对go语言基础做了一遍系统的学习,这里就当简单回顾一下,不再写过多笔记了,之前的写的博客都有基础知识,O(∩_∩)O ...

  6. Proe4.0使用VB.net生成缩略图方法

    Private Sub btnRasterImage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ...

  7. 填平新版本Xcode安装插件不成功的坑

    一般情况下,安装xcode不成功现象基本上都出现在更新xcode或者重装之后出现的情况,下面原理性德东西,我就不赘述了,度娘上很容易看到,通过这段只是希望大家花费尽量少得时间将xcode插件安装成功. ...

  8. 17.3.15---C语言详解FILE文件操作

    FILE 是 C语言文件结构定义, 打开文件和文件操作要用到这类结构.可以看成变量类型,用于变量声明.这个是一种数据结构类型,用来表示一个文件的相关信息,如果定义了一个文件指针,就用这个指针来指向某个 ...

  9. 14 微服务电商【黑马乐优商城】:day02-springcloud(理论篇一:HttpClient的简单使用)

    本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一: ...

  10. 分布式ID的简单总结

    来源:郴州网站优化 简单总结一下流行的分布式id的实现方法 雪花算法 snowflake是twitter开源的分布式ID生成算法. 核心思想是:分布式ID固定是一个long型的数字,一个long型占8 ...