学习笔记:克鲁斯卡尔算法

Posted arseneyao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记:克鲁斯卡尔算法相关的知识,希望对你有一定的参考价值。

一、算法描述

1.新建图,该图含有求最小生成树图中所有的顶点,但没有边。

2.将求最小生成树图中所有的边排序。

3.从权值最小的开始遍历每条边,若边中的两个点在新建图中不存在连通路径,则将其加入新建图中。

4.遍历结束新建图即为最小生成树。

 

二、算法实现

1.辅助数组判断两点是否连通。

 

#include <iostream>
#include <algorithm>
#include <vector>

struct edge {
    int u, v, w;
    edge(int u, int v, int w) :u(u), v(v), w(w) {};
    bool operator<(const edge& rhs)const {
        return w < rhs.w;
    }
};

const int maxn = 100;
int set_id[maxn];
int n, m;
std::vector<edge> edges;
std::vector<edge> mst_edges;

void kruskal() {
    std::sort(edges.begin(), edges.end());
    for (int i = 1; i <= n; i++)
        set_id[i] = i;
    for (std::vector<edge>::iterator itr = edges.begin(); itr != edges.end(); itr++) {
        if (set_id[itr->u] == set_id[itr->v])
            continue;
        for (int i = 1; i <= n; i++)
            if (i != itr->u && set_id[i] == set_id[itr->u])
                set_id[i] = set_id[itr->v];
        set_id[itr->u] = set_id[itr->v];
        mst_edges.push_back(*itr);
    }
    int sum = 0;
    for (edge e : mst_edges)
        sum += e.w;
    std::cout << sum << std::endl;
}

int main() {
    int u, v, w;
    std::cin >> n >> m;
    for (int i = 0; i < m; i++) {
        std::cin >> u >> v >> w;
        edges.push_back(edge(u, v, w));
    }
    kruskal();
    return 0;
}

 

以上是关于学习笔记:克鲁斯卡尔算法的主要内容,如果未能解决你的问题,请参考以下文章

数据结构学习笔记——图的应用1(最小生成树最短路径)

数据结构学习笔记——图的应用1(最小生成树最短路径)

数据结构学习笔记——图的应用1(最小生成树最短路径)

克鲁斯卡尔算法

(王道408考研数据结构)第六章图-第四节2:最小生成树之克鲁斯卡尔算法(思想代码演示答题规范)

最小生成树 普里姆算法和克鲁斯卡尔算法