算法 - 图(Graph)- 生成树(Spanning Tree)- Kruskal算法


Kruskal算法 - 执行过程

  • 按照边的权重顺序(从小到大)将边加入生成树中,知道生成树中含有V - 1条边位置(V是顶点数量)
  • 若加入该边会与生成树形成环,则不加入该边
  • 从第3条边开始,可能会与生成树形成环
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

Kruskal算法 - 实现

private Set<EdgeInfo<V, E>> kruskal() {
    int edgeSize = vertices.size() - 1;
    if (edgeSize == -1) return null;
    Set<EdgeInfo<V, E>> edgeInfos = new HashSet<>();
    MinHeap<Edge<V, E>> heap = new MinHeap<>(edges, edgeComparator);
    UnionFind<Vertex<V, E>> uf = new UnionFind<>();
    vertices.forEach((V v, Vertex<V, E> vertex) -> {
        uf.makeSet(vertex);
    });
    while(!heap.isEmpty() && edgeInfos.size() < edgeSize) {
        Edge<V, E> edge = heap.remove();
        if (uf.isSame(edge.from, edge.to)) continue;
        edgeInfos.add(edge.info());
        uf.union(edge.from, edge.to);
    }
    return edgeInfos;
}
  • 时间复杂度:O(ElogE)
发布了163 篇原创文章 · 获赞 18 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/songzhuo1991/article/details/103071806