• 【一个蒟蒻的挣扎】最小生成树—Kruskal算法


    济南集训第五天的东西,这篇可能有点讲不明白提前抱歉(我把笔记忘到别的地方了


     最小生成树

    概念:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边

    ​在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集(即)且为无循环图,使得 w(T) 最小,则此 T 为 G 的最小生成树。                                                                                                                                                                                                                                    

    最小生成树其实是最小权重生成树的简称。                                                                                                                           

    最小生成树性质:设G=(V,E)是一个连通网络,U是顶点集V的一个非空真子集。若(u,v)是G中一条“一个端点在U中(例如:u∈U),另一个端点不在U中的边(例如:v∈V-U),且(u,v)具有最小权值,则一定存在G的一棵最小生成树包括此边(u,v)。                                        

    性质证明:

    使用反证法证明;可参考旁边的图(画图画出来的,很丑见谅)

     

    先做以下约定:①将集合U中的顶点看作是红色顶点,②而V-U中的顶点看作是蓝色顶点,③连接红点和蓝点的边看作是紫色边,④权最小的紫边称为轻边(即权重最"轻"的边)。于是,MST性质中所述的边(u,v)就可简称为轻边。

    用反证法证明MST性质:

    假设G中任何一棵MST(最小生成树)都不含轻边(u,v)。则若T为G的任意一棵MST,那么它不含此轻边。

    根据树的定义,则T中必有一条从红点u到蓝点v的路径P,且P上必有一条紫边(u',v')连接红点集和蓝点集,否则u和v不连通。当把轻边(u,v)加入树T时,该轻边和P必构成了一个回路。删去紫边(u',v')后回路亦消除,由此可得另一生成树T'。

    T'和T的差别仅在于T'用轻边(u,v)取代了T中权重可能更大的紫边(u',v')。因为w(u,v)≤w(u',v'),所以

    w(T')=w(T)+w(u,v)-w(u',v')≤w(T)

    即T'是一棵比T更优的MST,所以T不是G的MST,这与假设矛盾。

    所以,MST性质成立。                                                                                                                                    ————以上来自于百度百科(卑微的蒟蒻)(他讲的比我好多了)

    有两种算法可以求最小生成树,Prim算法和Kruskal算法

    根据老师的说法prim不考(他也没上),所以这里只介绍Kruskal算法


    kruskal算法

     Kruskal算法所用的思想是贪心和并查集(所以还挺好理解的……吧……)

    • 按照边权将边进行排序,然后从小到大连接最小的边(贪心)
    • 若出现环,就跳过此边继续搜(用并查集判断)
    • 直到已经使用的边数量为点数n-1(这点应该是由于树的性质?恳请大佬解答!!!)

    ——证明过程待填充——

    思路部分看明白后大概就可以考虑代码了,想不出来欢迎来看一下我的程序(的注释)(仅能保证算法正确过得去洛谷模板题)

    写的出来就可以跳过这段(写的也不咋样的)代码试试下面的题目了!

    (洛谷模板题难度是 普及- 哦!!!努力努力肯定能想明白的!!!)

    (当然如果你是大佬来挑错也非常欢迎……私信好吗?)

    #include<iostream> 
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,m;
    struct edge
    {
        int u,v,w;
        edge(){};
        edge(int a,int b,int c)
        {
            u=a; v=b; w=c;
        }
    }E[200001];//建图存图 
    int ans=0;
    bool cmp(edge a,edge b)
    {
        return a.w<b.w;
    }//结构体快排 
    int fa[200001];
    int find(int x)
    {
        while(x!=fa[x]) x=fa[x]=fa[fa[x]];
        return x;
    }//并查集 
    int cnt;
    void kruskal()
    {
        sort(E+1,E+m+1,cmp);//先对边进行排序 
        for (int i=1; i<=m; i++)
        {
            int au=find(E[i].u),av=find(E[i].v);
            if (au==av)
            {
                continue;
            }//确定他们是否构成环(有同一个祖先),是的话就continue。 
            ans+=E[i].w;//将这个最小边权加入最后答案 
            fa[av]=au;//加入并查集 
            if (++cnt==n-1)
            {
                break;
            }//如果达到条件就退出 
        }
    }
    int main()
    {
        cin>>n>>m;
        for (int i=1; i<=n; i++)
        {
            fa[i]=i;
        }//对并查集的初始化 
        for (int i=1; i<=m; i++)
        {
            int a,b,c;
            cin>>a>>b>>c;
            E[i]=edge(a,b,c);//读入数据并存进边里 
        }
        kruskal();//
        cout<<ans;//输出答案! 
        return 0;//——结——束——啦 ——! 
    }
    代码看这里呐

    多练练哦,板子是要背掉的(你的板子背了没?没)

    可以的话继续往下


    例题练手

    这篇博客主要是介绍最小生成树和如何求最小生成树(Kruskal算法),讲题目并不是目的,所以这里只粘出了题目(我做过的相关的(我觉得海星的))和链接,有需要自行取用来练手,多练练总是好的

    https://www.luogu.org/problem/P3366                【普及-】

    • 这是个板子题啦,如果觉得我讲的很垃圾可以去看看题解,大概就能懂了,题解是大佬云集的地方呢(%%%)

    https://www.luogu.org/problem/P1991                【普及+/提高】

    • 要难一、、,多出了一种情况(还是最小生成树做,有大佬提出用瓶颈生成树然而——我并没有看懂)题目还行可以练练!

    2019-09-2420:22:54

    好的暂时先这么多,会在之后补充题目(加入好点的题删除不好的题)


    好的!那么到这里就结束啦!

    有看不懂的可以看看我里面提到的东西,我哪里写的不行也欢迎指正(私信)

    那么这篇博客就到这里啦

    感谢观看   ありがとうございます

  • 相关阅读:
    设计模式学习笔记(1)——简单工厂模式
    BarTender怎样同时打印自动日期和流水号?
    BarTender安装常见问题集结
    Windows更新导致的打印问题
    BarTender中如何为称重设备设置秤显示?
    BarTender中如何调整数据输入表单的大小?
    BarTender 2016如何导出模板为pdf文件?
    ABBYY PDF Transformer+安装教程
    ABBYY PDF Transformer+ 给你好看
    ABBYY PDF Transformer+功能概述
  • 原文地址:https://www.cnblogs.com/Phantomhive/p/11567902.html
Copyright © 2020-2023  润新知