
最小生成树(Minimum Spanning Tree,MST)是图论中一个重要的概念,它表示连接一个无向连通图的所有顶点的边的子集,且这些边的权值之和最小。有多种算法可以用来求解最小生成树,如Prim算法和Kruskal算法。本文将介绍如何使用C++实现Prim算法和Kruskal算法,并给出具体的代码示例。
Prim算法是一种贪心算法,它从图的一个顶点开始,逐步选择与当前最小生成树连接的权值最小的边,并将该边加入到最小生成树中。以下是Prim算法的C++代码示例:
#include #include #include using namespace std;const int INF = 1e9;int prim(vector<vector<pair>>& graph) { int n = graph.size(); // 图的顶点数 vector visited(n, false); // 标记顶点是否已访问 vector dist(n, INF); // 记录顶点到最小生成树的最短距离 int minCost = 0; // 最小生成树的总权值 // 从第一个顶点开始构建最小生成树 dist[0] = 0; // 使用优先队列保存当前距离最小的顶点和权值 priority_queue<pair, vector<pair>, greater<pair>> pq; pq.push(make_pair(0, 0)); while (!pq.empty()) { int u = pq.top().second; // 当前距离最小的顶点 pq.pop(); // 如果顶点已访问过,跳过 if (visited[u]) { continue; } visited[u] = true; // 标记顶点为已访问 minCost += dist[u]; // 加入顶点到最小生成树的权值 // 对于顶点u的所有邻接顶点v for (auto& edge : graph[u]) { int v = edge.first; int weight = edge.second; // 如果顶点v未访问过,并且到顶点v的距离更小 if (!visited[v] && weight > n >> m; vector<vector<pair>> graph(n); // 读取边的信息 for (int i = 0; i > u >> v >> w; --u; --v; // 顶点从0开始编号 graph[u].push_back(make_pair(v, w)); graph[v].push_back(make_pair(u, w)); } int minCost = prim(graph); cout << "最小生成树的权值之和为:" << minCost << endl; return 0;}
Kruskal算法是一种基于边的贪心算法,它从图的所有边中选择权值最小的边,并判断该边是否会形成环路。如果不会形成环路,则将该边加入到最小生成树中。以下是Kruskal算法的C++代码示例:
立即学习“C++免费学习笔记(深入)”;
#include #include #include using namespace std;struct Edge { int u, v, weight; // 边的两个顶点及其权值 Edge(int u, int v, int weight) : u(u), v(v), weight(weight) {}};const int MAXN = 100; // 最大顶点数int parent[MAXN]; // 并查集数组bool compare(Edge a, Edge b) { return a.weight < b.weight;}int findParent(int x) { if (parent[x] == x) { return x; } return parent[x] = findParent(parent[x]);}void unionSet(int x, int y) { int xParent = findParent(x); int yParent = findParent(y); if (xParent != yParent) { parent[yParent] = xParent; }}int kruskal(vector& edges, int n) { sort(edges.begin(), edges.end(), compare); int minCost = 0; // 最小生成树的总权值 for (int i = 0; i > n >> m; vector edges; // 读取边的信息 for (int i = 0; i > u >> v >> w; edges.push_back(Edge(u, v, w)); } int minCost = kruskal(edges, n); cout << "最小生成树的权值之和为:" << minCost << endl; return 0;}
通过以上代码示例,我们可以在C++中使用Prim算法和Kruskal算法求解最小生成树的问题。在实际应用中,可以根据具体情况选择合适的算法来解决问题。这些算法的时间复杂度分别为O(ElogV)和O(ElogE),其中V为顶点数,E为边数。因此,它们在处理大规模图的情况下也能够得到较好的效果。
以上就是如何使用C++中的最小生成树算法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1445548.html
微信扫一扫
支付宝扫一扫