首页 > 其他分享 >最小生成树

最小生成树

时间:2024-09-15 23:21:47浏览次数:3  
标签:const int 最小 生成 return edges dist include

最小生成树

Prim

朴素Prim O(n2)

堆优化Prim O(mlogn)

Kruskal O(mlogm)

Prim

//模板
int n;      // n表示点数
int g[N][N];        // 邻接矩阵,存储所有边
int dist[N];        // 存储其他点到当前最小生成树的距离
bool st[N];     // 存储每个点是否已经在生成树中


// 如果图不连通,则返回INF(值是0x3f3f3f3f), 否则返回最小生成树的树边权重之和
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];
        st[t] = true;

        for (int j = 1; j <= n; j ++ ) dist[j] = min(dist[j], g[t][j]);
    }

    return res;
}
//Prim算法求最小生成树
#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;
const int N = 510, INF = 0x3f3f3f3f;
int n,m;
int g[N][N],dis[N];
bool st[N];

int prim(){
    memset(dis,0x3f,sizeof dis);
    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||dis[j]<dis[t]))
                t=j;
        }
        //printf("%d\n%d",t,dis[t]);
        if(i&&dis[t] == INF) return INF;
        if(i) res+=dis[t];
        st[t] = true;
        for(int j = 1;j<=n;j++) dis[j] = min(dis[j],g[t][j]);
    }
    return res;
}

int main(){
    cin>>n>>m;
    int a,b,c;
    for(int i = 1;i<=n;i++)
        for(int j = 1;j<=n;j++){
            if(i==j) g[i][j] = 0;
            else g[i][j] = INF;
        }
        
    while(m--){
        cin>>a>>b>>c;
        g[a][b] = g[b][a] = min(g[a][b],c);
    }
    int t = prim();
    if(t == INF) puts("impossible");
    else printf("%d",t);
    
    return 0;
}

Kruskal

//模板
int n, m;       // n是点数,m是边数
int p[N];       // 并查集的父节点数组

struct Edge     // 存储边
{
    int a, b, w;

    bool operator< (const Edge &W)const
    {
        return w < W.w;
    }
}edges[M];

int find(int x)     // 并查集核心操作
{
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}

int kruskal()
{
    sort(edges, edges + m);

    for (int i = 1; i <= n; i ++ ) p[i] = i;    // 初始化并查集

    int res = 0, 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) return INF;
    return res;
}
//Kruskal算法求最小生成树
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;
const int N = 2e5+10,M = 2e5+10;
int n,m;
int p[M];
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]);
    else return x;
}

int Kruskal(){
    int res = 0,cnt = 0;
    for(int i = 0;i<m;i++){
        int a = edges[i].a;
        int b = edges[i].b;
        int w = edges[i].w;
        
        if(find(a)!=find(b)){
            p[find(a)] = p[find(b)];
            cnt++;
            res+=w;
        }
    }
    if(cnt==n-1) return res;
    else return 0x3f3f3f3f;
}

int main(){
    cin>>n>>m;
    int a,b,w;
    for(int i = 0;i<n;i++) p[i] = i;
    for(int i = 0;i<=m;i++){
        cin>>a>>b>>w;
        edges[i] = {a,b,w};
    }
    sort(edges,edges+m);
    int t = Kruskal();
    
    if(t==0x3f3f3f3f) puts("impossible");
    else printf("%d",t);
    
    return 0;
}

vscode迁移

在这里插入图片描述

标签:const,int,最小,生成,return,edges,dist,include
From: https://blog.csdn.net/DaPeng20020626/article/details/142186241

相关文章

  • 谷歌图像生成AI-imagen 3新手入门指南!
    1Google最近推出了Imagen3,这是目前为止其最先进的文本生成图像模型。它基于之前的版本进行了改进,提供了更加精确的图像生成,减少了图像中的瑕疵,能够生成逼真、栩栩如生的图像。相比于早期版本,Imagen3可以处理更加复杂的文本描述,生成的图像在一致性和连贯性上有了显著提升......
  • 【油猴脚本】00008 案例 Tampermonkey油猴脚本,动态渲染表格-实现页面动态-添加表格列,
    前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦......
  • 生成器与lambda表达式
    目录生成器特性迭代器协议迭代器协议的工作原理使用生成器计算程序花费时间lambda函数生成器yield关键字用于创建生成器(generator)生成器是一种特殊的迭代器,不需要一次性将所有数据加载到内存中,使用yield关键字,函数可以返回一个值,然后在下一次调用时从上次返回的位置继续执......
  • leetcode438.找到字符串中所有字母异位词、leetcode3.无重复字符的最长子串、leetcode
    leetcode438、找到字符串中所有字母异位词给定两个字符串s和p,找到s中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词指由相同字母重排列形成的字符串(包括相同的字符串)。示例1:输入:s=“cbaebabacd”,p=“abc”输出:[0,6]......
  • 76. 最小覆盖子串
    classSolution{public:map<char,int>maps,mapt;boolisContained(){for(pair<char,int>elem:mapt){if(elem.second>maps[elem.first])returnfalse;}returntrue;}stringminWindow......
  • 1928.规定时间内到达终点的最小话费,题解
    1928.规定时间内到达终点的最小花费-力扣(LeetCode)有点难,参考官方题解代码:利用了动态规划思想,逐步计算从起点到各个城市在不同时间下的最小费用。 1.代码解释,涉及,static关键字,constexpr关键字,INT_MAX除以2赋值的含义staticconstexprintINFTY=INT_MAX/2; 1.**`......
  • 以最小成本实现最大销售:《稻盛和夫的实学:经营与会计》中的企业经营哲学
    在《经营与会计》中稻盛和夫提出,会计是现代企业经营的中枢,经营者必须掌握企业活动的真实状态,才能带领企业长期持续的发展。 经营企业要以现金为基础,把握赚的钱在哪里,以什么形式存在,根据手上确凿无疑的现金来掌舵。合理的经营,以作为人,何谓正确对事物做出判断,要追溯事物的本源......
  • 【Python基础】Python迭代器与生成器(两种强大工具)
    本文收录于《Python编程入门》专栏,从零基础开始,分享一些Python编程基础知识,欢迎关注,谢谢!文章目录一、前言二、迭代器2.1创建迭代器2.2自定义迭代器2.3处理大型文件三、生成器四、生成器表达式五、实际应用案例5.1数据库查询5.2网络数据流处理六、总结一......
  • 预警提醒并生成日志,便于后期追溯的智慧地产开源了。
    智慧地产视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。AI是新形势下数字经济的重要基础设施,具备同各行各业结......
  • 帝国cms生成静态文件怎么用
    在帝国CMS中生成静态文件的过程主要包括几个步骤:配置伪静态、生成静态文件以及配置服务器。下面详细介绍如何使用帝国CMS生成静态文件:1.开启伪静态功能伪静态可以让动态页面看起来像是静态页面,这对于SEO和用户体验都有好处。登录后台:首先登录帝国CMS的后台管理界面。进入系......