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

最小生成树

时间:2024-10-13 23:00:25浏览次数:1  
标签:Node int 边权 最小 生成 vis dis

定义:在无向连通图中边权和最小的生成树为最小生成树。生成树的定义是在一个无向图中包含所有节点且边数最少的连通子图。

Kruskal算法

考虑一种贪心,我们将边权从小到大排列,依次将边加入生成树中,如果此次加边形成了环,则扔掉这条边。
我们可以轻易证明此贪心的正确性,若在某次加入中此条边不是最小生成树的一条边,那后面这两个点最终也要连起来,这两个点连起来的路径和这条边会组成一个环,这个环中一定有边权大于这条边的边权(因为一定有比这条边后加入的边,不然这条边加入就会组成环被扔掉),用这条边替换,图依旧联通,但是总权值减少了,所以要是不选取这条边,接下来构成的生成树一定不是最少的。
代码实现我们需要用并查集查询两点是否联通和将两点连接。

点击查看代码
struct Node{
    int u,v,w;
}g[N];
bool cmp(Node x,Node y){
    return x.w<y.w;
}
int fa[N],n,m,ans;//m表示边数,n表示点数,ans表示总权值
//标准并查集
int find(int x){
    if(fa[x]==x) return fa[x];
    return fa[x]=find(fa[x]);
}
void merge(int x,int y){
    if(find(x)!=find(y)) fa[find(x)]=find(y);
}
void kruskal(){
    int tot=0;
    sort(g+1,g+1+m,cmp);
    for(int i=1;i<=m;i++){
        if(find(g[i].u)!=find(g[i].v)){//如果没有形成环就加入
            tot++;
            ans+=g[i].w;
            if(tot>=n-1){
                cout<<ans;
                return;//已建成最小生成树,返回
            }
            merge(g[i].u,g[i].v);
        }
    }
    cout<<"no answer";//若未返回就是找不到
}

Prim算法

从一个节点开始,选择距离最小的节点,类似Dijkstra算法的操作,理论上来说在稠密图时间复杂度优于Kruskal算法,但是Prim算法的常数十分大,实际不一定跑下来更快。

点击查看代码
struct Node{
    int u,v,w;
};
vector<Node>g[N];
struct T{
    int d,u;
    friend bool operator<(T a,T b){
        return a.d>b.d;
    }
};
priority_queue< T > q;
int n,m,dis[N],vis[N];
int prim(){
    int ans=0;
    memset(vis,0,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));
    dis[1]=0;
    q.push(T{0,1});
    while(!q.empty()){
        T t=q.top();
        q.pop();
        int d=t.d,u=t.u;
        if(vis[u]) continue;
        vis[u]=1;
        ans+=d;
        for(Node e:g[u]){
            int v=e.v;
            if(!vis[v]) q.push(T{e.w,v});
        }
    }
    return ans;
}

标签:Node,int,边权,最小,生成,vis,dis
From: https://www.cnblogs.com/bssmessi/p/18457461

相关文章

  • 【AI论文精读3】RAG论文综述1-P4-生成和增强
    【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI大项目】【AI应用】P1,P2,P3四、生成在检索之后,直接将所有检索到的信息输入到大语言模型(LLM)中以回答问题并不是一种良好的做法。接下来将从两个方面介绍调整方法:调整检索到的内容和调整大语言模型。4.1上......
  • 齐次方程组(超定方程组)的最小二乘解,及利用其拟合空间平面
    理论齐次方程组形如:。在一些优化,拟合等问题中经常出现,我们常考虑方程多于未知数元数的情况------超定方程组。首先对于平凡解x=0我们一般不感兴趣,一般我们会寻求方程组的非零解。如果x是方程组的一个解,那么对于,也是齐次方程组的解,一个合理的假设是只求满足的解。假设A的维数是......
  • 一键生成证件照的开源利器:HivisionIDPhotos使用教程
    HivisionIDPhotos使用教程:一键生成证件照的开源利器HivisionIDPhotos 是一款开源的、轻量级且高效的AI工具,专注于证件照的自动生成。通过这一工具,用户只需上传一张自拍或其他照片,便能快速生成标准尺寸的证件照,免去前往照相馆的麻烦。它利用先进的图像处理技术,如智能抠图......
  • 一文带你了解生成树协议三个版本:STP、RSTP 和 MSTP
    生成树协议(SpanningTreeProtocol,STP)及其后续改进版,如快速生成树协议(RapidSpanningTreeProtocol,RSTP)和多生成树协议(MultipleSpanningTreeProtocol,MSTP),是保证网络冗余与稳定的关键技术。这些协议能够防止环路的出现,从而避免广播风暴和通信中断。本文将详细介绍STP、R......
  • AIGC在游戏开发中的潜力:自动生成游戏内容
    AIGC在游戏开发中的潜力:自动生成游戏内容随着游戏行业的快速发展,自动化生成内容(AIGC,ArtificialIntelligenceGeneratedContent)在游戏开发中的潜力日益受到关注。通过AIGC,开发者可以借助人工智能来自动生成游戏中的角色、场景、任务等内容,从而大幅减少开发时间,提升游戏的丰富性......
  • 最近雷军AI配音火出圈,一键免费生成!保姆级教程分享!
    这两天被雷军这个AI配音刷屏了,在某音,B站上大火!特别是一些游戏解说都用他的AI配音,随便发一个视频播放量是杠杠的!也算是一个热点了,这热点可以蹭一波。那这个AI配音到底是怎么做出来的呢?其实非常简单,互联网就是信息差,谁先掌握了第一手信息,谁就可以吃肉!几天就给大家讲下如何......
  • 最近雷军AI配音火出圈,一键免费生成!保姆级教程分享!
    这两天被雷军这个AI配音刷屏了,在某音,B站上大火!特别是一些游戏解说都用他的AI配音,随便发一个视频播放量是杠杠的!也算是一个热点了,这热点可以蹭一波。那这个AI配音到底是怎么做出来的呢?其实非常简单,互联网就是信息差,谁先掌握了第一手信息,谁就可以吃肉!几天就给大家讲下如何......
  • 最近雷军AI配音火出圈,一键免费生成!保姆级教程分享!
    这两天被雷军这个AI配音刷屏了,在某音,B站上大火!特别是一些游戏解说都用他的AI配音,随便发一个视频播放量是杠杠的!也算是一个热点了,这热点可以蹭一波。那这个AI配音到底是怎么做出来的呢?其实非常简单,互联网就是信息差,谁先掌握了第一手信息,谁就可以吃肉!几天就给大家讲下如何......
  • go gorm StructField动态生成结构体查询单条表记录
    funcTest014_TakeTableFields(t*testing.T){vardbRequest=Default().SetPageSize(2)dbRequest.TableName="sys_dept"dbRequest.FieldsName="dept_id,dept_name"varresult=dbRequest.GeneralTakeTable()golog.Info......
  • go gorm StructField动态生成结构体查询多条表记录
    water/gowebfuncTest013_GeneralScanTable(t*testing.T){vardbRequest=Default().SetPageSize(3)dbRequest.TableName="sys_dept"dbRequest.FieldsName="dept_id,dept_name"//dbRequest.SetQueryAll(true)varresult=......