Kruskal算法-最小生成树

算法思想:

1 将G的n个顶点看成n个孤立的连通分支,所有的边按权从小到大排序

2 当查看到第k条边时,

  如果断点v和w分别是当前的两个不同的连通分支t1和t2中的顶点时,就用边(v,m)j将t1,t2连接成一个连通分支,然后继续查看第k+1条边;

  如果端点v和w当前的同一个连通分支中,就直接查看第k+1条边

实现代码:

template <class Type>
class EdgeNode{
    friend ostream& operator<<(ostream&,EdgeNode<Type>);
    friend bool Kruskal(int,int,EdgeNode<Type> *,EdgeNode<Type> *);
    friend void main(void);
    public:
        operator Type() const{return weight;}
    private:
        Type weight;
        int u,v;
};
template <class Type>
bool Kruskal(int n,int e,EdgeNode<Type> E[],EdgeNode <Type> t[])
{
    MinHeap<EdgeNode<Type>> H(1);
    H.Initialize(E,e,e);
    UnionFind U(n);
    int k = 0;
    while(e && k<n-1)
    {
        EdgeNode<int> x;
        H.DeleteMin(x);
        e--;
        int a = U.Find(x.u);
        int b = U.Find(x.v);
        if(a != b)
        {
            t[k++] = x;
            U.Union(a,b);
        }
    }
    H.Deactivate();
    return (k == n-1);
}

 

本文转自博客园xingoo的博客,原文链接:Kruskal算法-最小生成树,如需转载请自行联系原博主。

时间: 2024-08-02 22:55:01

Kruskal算法-最小生成树的相关文章

最小生成树算法:Kruskal算法的Java实现

闲来无事,写个算法,最小生成树的Kruskal算法,相对比Prim算法实现起来麻烦一点点 package trees; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.PriorityQueue; import java.util.Set; /** * 最小生成树的Kruskal算法, * For a connected weighted graph G, a s

最小生成树之Prim算法和Kruskal算法

一个连通图可能有多棵生成树,而最小生成树是一副连通加权无向图中一颗权值最小的生成树,它可以根据Prim算法和Kruskal算法得出,这两个算法分别从点和边的角度来解决. Prim算法 输入:一个加权连通图,其中顶点集合为V,边集合为E: 初始化:Vn = {x},其中x为集合V中的任一节点(起始点),Enew = {}: 重复下列操作,直到Vn = V:(在集合E中选取权值最小的边(u, v),其中u为集合Vn中的元素,而v则是V中没有加入Vn的顶点(如果存在有多条满足前述条件即具有相同权值的边

对给定的图结构,实现求解最小生成树的Kruskal算法,并给出求解过程的动态演示。

问题描述 对给定的图结构,实现求解最小生成树的Kruskal算法,并给出求解过程的动态演示. 我想问的是,这个算法编写出来的代码怎么运行实现动态演示,不会..求高手赐教 解决方案 我觉得所谓动态演示,无非就是你要画出一个图,表示节点和边.然后每添加/删除一条边,间隔几秒钟,画出来. 这样就是动态演示了. 解决方案二: http://zhidao.baidu.com/link?url=cWDT4w0qf9IvupdcjRf2IR5TyoZpVoKOXlpGwR6td7wwpQb1xGJIfyP_Y

图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 B(G).其中 T(G)是遍历图时所经过的边的集合,B(G) 是遍历图时未经过的边的集合.显然,G1(V, T) 是图 G 的极小连通子图,即子图G1 是连通图 G 的生成树. 深度优先生成森林   右边的是深度优先生成森林: 连通图的生成树不一定是唯一的,不同的遍历图的方法得到不同的生成树;从不

Kruskal算法(三) Java详解

最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总和不相同的生成树. 克鲁斯卡尔算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路. 具体做法:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回

Kruskal算法(二) C++详解

最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总和不相同的生成树. 克鲁斯卡尔算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路. 具体做法:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回

Kruskal算法(一) C语言详解

最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总和不相同的生成树. 克鲁斯卡尔算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路. 具体做法:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回

经典算法题每日演练——第十六题 Kruskal算法

     这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想     若存在M={0,1,2,3,4,5}这样6个节点,我们知道Prim算法构建生成树是从"顶点"这个角度来思考的,然后采用"贪心思想" 来一步步扩大化,最后形成整体最优解,而Kruskal算法有点意思,它是站在"边"这个角度在思考的,首先我有两个集合. 1. 顶点集合(vertexs):      比如M集合

【算法小总结】Prim算法与Kruskal算法探索

以前以为自己用的生成最小生成树的方法是Prim算法,今天自己拜读了<数据结构与算法分析>之后才知道自己有多愚蠢,原来以前一直用的是KrusKal算法...... 今天好好说道说道这两个算法: KrusKal算法用于稀疏图,贪心策略,连续的按照最小的权值选择边. Prim算法用于稠密图,也是贪心策略,每次取离小生成树最近的点作为生成树的心点,并入生成树内生成新的小生成树,知道所有节点均被纳入生成树后结束.   这两种方法均可得到点点之间路径最短的联通图.   例如这个例子:   用Prim算法的