码迷,mamicode.com
首页 > 编程语言 > 详细

学习笔记:普里姆算法

时间:2018-01-06 19:09:49      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:break   for   ons   生成树   +=   include   nbsp   mst   ase   

一、算法描述

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

 

学习笔记:普里姆算法

标签:break   for   ons   生成树   +=   include   nbsp   mst   ase   

原文地址:https://www.cnblogs.com/arseneyao/p/8214774.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!