学习笔记:普里姆算法

Posted arseneyao

tags:

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

一、算法描述

1.初始化最小生成树仅包含图中的任意顶点,不包含任何边。

2.从图中选择一条权值最小的边,该边有且仅有一个顶点在最小生成树中。将该边加入最小生成树中。

3.重复上一步直到图中所有的顶点都在最小生成树中。

 

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

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;
    }
};

int n, m;
std::vector<edge> edges;
std::vector<edge> mst_edges;
std::set<int> mst_vertexs;

void prim(int start_vertex) {
    mst_vertexs.insert(start_vertex);
    while (mst_vertexs.size() != n) {
        std::vector<edge>::iterator itr = edges.begin();
        while (itr != edges.end()) {
            int count = 0;
            if (mst_vertexs.count(itr->u)) count++;
            if (mst_vertexs.count(itr->v)) count++;
            if (count == 1) break;
            else itr++;
        }
        if (itr != edges.end()) {
            mst_vertexs.insert(itr->u);
            mst_vertexs.insert(itr->v);
            mst_edges.push_back(*itr);
            edges.erase(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));
    }
    std::sort(edges.begin(), edges.end());
    int start_vertex = 1;
    prim(start_vertex);
    return 0;
}

 

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

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

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

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

学习数据结构笔记(21) --- [克鲁斯卡尔算法(Kruskal Algorithm) 由公交车站连接问题引入]

算法普里姆算法 Prim算法解决修路问题

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