一、算法描述
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; }