最小生成树基础算法

news/2024/7/24 8:32:10 标签: 算法, 数据结构, 图论

在这里插入图片描述

Prim

Prim算法求最小生成树
与dijkstra算法类似,dijkstra算法是计算一个节点到其他节点的最短路,Prim算法是需要维护节点到一个集合的距离最小值,优化方式也是类似的,只需要用堆来维护距离即可

#include <bits/stdc++.h>
using namespace std;
const int N = 510, INF = 0x3f3f3f3f;
int n, m;
int g[N][N]; //邻接矩阵存图
int dist[N]; //距离数组
bool st[N];  //判断当前点是否被用到
int prim()
{
    memset(dist, 0x3f, sizeof(dist));
    int res = 0;
    for (int i = 0; i < n; i++)
    {
        int t = -1;
        for (int j = 1; j <= n; j++) //找到未在集合中的点距离当前集合最近的点
        {
            if (!st[j] && (t == -1 || dist[t] > dist[j]))
                t = j;
        }
        if (i && dist[t] == INF) //表示第一次用到的这个点与集合不连通,即没有最小生成树
            return INF;
        if (i) //如果不是第一次的话,将距离叠加,只有一个点没有最小生成树的概念
            res += dist[t];
        for (int j = 1; j <= n; j++) //用这个点的距离更新这个点到集合的距离
            dist[j] = min(dist[j], g[t][j]);
        st[t] = true;
    }
    return res;
}
int main()
{
    cin >> n >> m;
    memset(g, 0x3f, sizeof(g));
    while (m--)
    {
        int a, b, w;
        cin >> a >> b >> w;
        g[b][a] = g[a][b] = min(g[a][b], w);
    }
    int t = prim();
    if (t == INF) //当所有点不连通的时候,不存在最小生成树
        cout << "impossible" << endl;
    else
        cout << t << endl;
    return 0;
}

Kruskal

Kruskal算法求最小生成树
将图中的边按权重排序,遍历每一条边,如果两条边不连通,就连在一起
这里使用了并查集维护每一条边

#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int n, m;
int p[N]; //用并查集,维护边的权重,降低时间复杂度
struct Edge
{
    int a, b, w;
    bool operator<(const Edge &W) const
    {
        return w < W.w;
    }
} edges[N];
int find(int x) //并查集中找祖宗节点+优化的函数
{
    if (p[x] != x)
        p[x] = find(p[x]);
    return p[x];
}
int main()
{
    cin >> n >> m;
    for (int i = 0; i < m; i++)
    {
        int a, b, w;
        cin >> a >> b >> w;
        edges[i] = {a, b, w};
    }
    sort(edges, edges + m);
    for (int i = 1; i <= n; i++) //初始化并查集
        p[i] = i;
    int res = 0; //存储最小生成树中所有边的权重之和
    int cnt = 0; //存储当前一共加了多少条边
    for (int i = 0; i < m; i++)
    {
        int a = edges[i].a, b = edges[i].b, w = edges[i].w;
        a = find(a), b = find(b); //并查集中的算法
        if (a != b)
        {
            p[a] = b;
            res += w;
            cnt++;
        }
    }
    if (cnt < n - 1) //表示存在不连通的点,即不存在最小生成树
        cout << "impossible" << endl;
    else //输出答案
        cout << res << endl;
    return 0;
}

http://www.niftyadmin.cn/n/815819.html

相关文章

英语购物计算机,赖世雄购物英语口语大全(68)买计算机 (3)

Unit 68 Buying a Computer(3) 买计算机 (3)S Salesperson  C CustomerThe customer is choosing a computer with the assistance of the salesperson.顾客在售货员的协助下正在选择计算机。S: This is a good basic computer package. Its got a good CPU, 256 megabytes…

omniplan导出html,MAC系统下的甘特图神器——Omniplan3使用指南

OmniPlan是Mac OS X平台的的一款非常强大的项目管理软件&#xff0c;它提供的功能包含了自定检视表、阶层式的纲要模式、成本追踪、里程碑、任务限制与相关性、资源分配、时程控制、Gantt图表、违反事项显示、关键路径等等。除了附带项目策划专业用户需要的Gnatt图等多种功能外…

blos硬盘启动台式计算机,教你联想 (Lenovo)台式机bios修改硬盘启动技巧

大家都明白&#xff0c;现在U盘装系统是如今最快捷也是很流畅的重装系统步骤之一&#xff0c;那么针对联想品牌台式电脑来说&#xff0c;怎么设定U盘启动就能开始一键U盘装系统呢?下面就跟随小编来学习上联想品牌台式电脑怎么设置U盘启动。首先我们的u盘需要是将要制作好的启动…

电气专业三加一学计算机,我上的中专学校,但是我的专业是三加一大专,但是到了我们快毕业的时候才知道原来想拿大专证还要考但是学校不给退怎么办...

咨询我帮助人数&#xff1a;3403295协商解决。学习中专原则是要求初中毕业的&#xff0c;不过你要是满十六周岁的话&#xff0c;就可以办理学籍了。如果不满十六就比较麻烦&#xff0c;最好回学校补个毕业证或开个毕业证明。建议还是从中专一步一步学起&#xff0c;现在国家对中…

某用户的计算机最近运行速度明显变慢,求助关于电脑运行速度的问题.

朋友你好&#xff01;如果想要自己的电脑运行流畅&#xff1a;一、首先对电脑进行分析碎片整理&#xff0d;&#xff0d;打开我的电脑&#xff0d;&#xff0d;随便右键点击个分区盘&#xff0d;&#xff0d;属性&#xff0d;&#xff0d;工具&#xff0d;&#xff0d;碎片整理…

函授计算机文化基础 1测试题答案完整的计算机系统由( c )组成.,计算机文化基础试题及答案十一月整理.pdf...

大学计算机文化基础试题及答案一、单选题练习1&#xff0e;完整的计算机系统由( C )组成。A&#xff0e;运算器、控制器、存储器、输入设备和输出设备B&#xff0e;主机和外部设备C&#xff0e;硬件系统和软件系统D&#xff0e;主机箱、显示器、键盘、鼠标、打印机2&#xff0e…

计算机容差技术CAT最新应用,计算机辅助飞机制造容差优化设计技术研究-航空宇航制造工程专业论文.docx...

南京航空航天大学硕士学位论文计算机辅助飞机制造容差优化设计技术研究姓名&#xff1a;姚澎涛申请学位级别&#xff1a;硕士专业&#xff1a;航空宇航制造工程指导教师&#xff1a;周来水2011-03南京航空航天大学硕士学位论文南京航空航天大学硕士学位论文计算机辅助飞机制造容…

计算机旅游网站论文,设计一个旅游网站 计算机专业毕业论文.doc

南京财经大学本科毕业设计 学校代码&#xff1a;10327学 号&#xff1a;4202100102本科毕业设计中文题目&#xff1a; 旅游网站英文题目&#xff1a; Tourism Website所在院系&#xff1a; 信息工程学院专业班级&#xff1a; 计算机科学与技术(嵌入式软件人才培养)学生姓名&…