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