对于任给的一张无向带权连通图,求出其最小生成树(C++)

对于任给的一张无向带权连通图,求出其最小生成树。

题目要求:

(1)编程创建一幅图
(2)输出创建的图
(3)编写Prim算法代码,实现图的最小生成树求解,且输出最小生成树
(4)编写Kruskal算法代码,实现图的最小生成树求解,且输出最小生成树
(5)编写菜单,允许用户选择相应操作

代码如下:

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
const int maxVertexNum = 30;//最大顶点数
const int noEdge = 99999999;//用来记录两个顶点之间没有边
const int ERROR = -1;//发生错误class Graph
{
private :class Edge{public :int v1;int v2;int w;};int edgeNum;//边数int vertexNum;//顶点数int vertexs[maxVertexNum][maxVertexNum];//邻接矩阵bool vis[maxVertexNum];//用来标记是否访问过该顶点int dist[maxVertexNum];//prim算法中用来记录该结点离最小生成树的距离int parent[maxVertexNum];//prim算法中用到Edge edge[maxVertexNum];//用来记录边,方便输出int totalWeight;//最小权重和int set[maxVertexNum];//kruskal算法中,集合数组,利用并查集算法,来判断是否构成回路Edge kEdge[maxVertexNum];//kruskal算法中所用,用来记录创建的图的信息,在用kruskal算法时,不是用邻接矩阵存储的图,而是用了这个结构体数组来存储public:void menu(){char c;while (true){cout << "--------邻接矩阵存储的图--------------" << endl;cout << "--------输入 c 创建图-----------------" << endl;cout << "--------输入 p 输出图-----------------" << endl;cout << "--------输入 r 使用prim算法-----------" << endl;cout << "--------输入 k 使用kruskal算法--------" << endl;cout << "--------输入 e 退出程序---------------" << endl;cout << "---------顶点从0开始------------------" << endl;cin >> c;switch (c){case 'c':buildGraph();cout << "创建完毕,按任意键继续" << endl;c = getchar();//吃回车c = getchar();//吃任意键system("cls");//刷新屏幕break;case 'p':printGraph();cout << "输出完毕,按任意键继续" << endl;c = getchar();c = getchar();system("cls");break;case 'r':prim();cout << "输出完毕,按任意键继续" << endl;c = getchar();c = getchar();system("cls");break;case 'k':kruskal();cout << "输出完毕,按任意键继续" << endl;c = getchar();c = getchar();system("cls");break;case 'e':return;}}}Graph() :vertexNum(0), edgeNum(0){initVis();for (int i = 0; i < maxVertexNum; i++){for (int j = 0; j < maxVertexNum; j++){vertexs[i][j] = noEdge;}}}private:void initSet(){for (int i = 0; i < vertexNum; i++) set[i] = i;}void Union(int root1, int root2){int x = Find(root1);int y = Find(root2);if (x != y){set[x] = y;}}int Find(int x){if (set[x] != x) return Find(set[x]);else return x;}void initVis(){for (int i = 0; i < maxVertexNum; i++){vis[i] = false;}}void buildGraph(){cout << "请输入节点数和边数" << endl;cin >> vertexNum >> edgeNum;int e1, e2;int w;for (int i = 0; i < edgeNum; i++){cin >> e1 >> e2>>w;vertexs[e1][e2] = w;vertexs[e2][e1] = w;kEdge[i].v1 = e1;kEdge[i].v2 = e2;kEdge[i].w = w;}}void printGraph(){for (int i = 0; i < vertexNum; i++){vis[i] = true;for (int j = 0; j < vertexNum; j++){if (!vis[j]&&vertexs[i][j] != noEdge){cout << i << " - " << j <<" = "<<vertexs[i][j]<< endl;}}}initVis();}int findMinDist(){int minVertex;int minDist = noEdge;for (int i = 0; i < vertexNum; i++){if (dist[i] != 0 && dist[i] < minDist){minDist = dist[i];minVertex = i;}}if (minDist < noEdge) return minVertex;else return ERROR;}void prim(){for (int i = 0; i < vertexNum; i++){dist[i] = vertexs[0][i];parent[i] = 0;}totalWeight = 0;int cnt = 0;dist[0] = 0;parent[0] = -1;cnt++;int v;while (true){v = findMinDist();if (v == ERROR) break;edge[cnt].v1 = parent[v];edge[cnt].v2 = v;edge[cnt].w = dist[v];totalWeight += dist[v];dist[v] = 0;cnt++;for (int w = 0; w < vertexNum; w++){if (dist[w] != 0 && vertexs[v][w] < noEdge){dist[w] = vertexs[v][w];parent[w] = v;}}}if (cnt < vertexNum){cout << "此图不连通" << endl;}else{for (int i = 1; i < cnt; i++){cout << edge[i].v1 << " - " << edge[i].v2 << " = " << edge[i].w << endl;}cout <<"totalWeight = " <<totalWeight << endl;}}//所有普通类成员函数,都不能以函数指针的方式作为其他函数的入口函数。//所以这里的cmp函数要加上staticstatic bool cmp(Edge a, Edge b){return a.w < b.w;}void kruskal(){initSet();sort(kEdge,kEdge+edgeNum,cmp);int cnt = 0;int idx = 0;totalWeight = 0;while (cnt < vertexNum - 1 && idx < edgeNum){int v1 = kEdge[idx].v1;int v2 = kEdge[idx].v2;if (Find(v1) != Find(v2)){edge[cnt].v1 = v1;edge[cnt].v2 = v2;edge[cnt].w = kEdge[cnt].w;totalWeight += edge[cnt].w;cnt++;Union(v1, v2);}idx++;}if (cnt < vertexNum - 1){cout << "此图不连通" << endl;}else{for (int i = 0; i < vertexNum - 1; i++){cout << edge[i].v1 << " - " << edge[i].v2 << " = " << edge[i].w << endl;}cout << "totalWeight = " << totalWeight << endl;}}};int main()
{Graph g;g.menu();return 0;
}

示例:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用.Net Core实现的一个图形验证码

SimpleCaptcha是一个使用简单&#xff0c;基于.Net Standard 2.0的图形验证码模块。它的灵感来源于Edi.Wang的这篇文章https://edi.wang/post/2018/10/13/generate-captcha-code-aspnet-core&#xff0c;我将其中生成验证码的代码抽取出来进行封装得到了这个模块。下面介绍一下…

Maven编译项目时报错:不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本。

在使用Maven编译项目时报错&#xff1a; 不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本。 在项目pom.xml文件中增加maven编译的jdk版本设置&#xff0c;maven.compiler.source和maven.compiler.target&#xff1a; <properties&…

ABP框架 v3.0 已发布!

我们很高兴地宣布,ABP框架和ABP商业版3.0版已经发布.与常规的2周发布一个版本不同的是, 这个版本用了4周的时间.关闭了119个issue,合并了89个pull request 和主框架仓库中的798次提交.由于这是一个主要版本,它也包括了一些重大更改.不要害怕,这些变化都容易对应,并且下面会详细…

C++实现dijkstra单源最短路径

代码如下: #include <iostream> using namespace std; const int N 30; typedef char ElemType; const double noEdge 99999;class Graph { private:double G[N][N];int vertexN, edgeN;double dist[N];bool vis[N];int path[N];int sv;ElemType data[N];int findMinD…

WPF 框架全构建环境虚拟机硬盘分享

现在 WPF 完全开源了&#xff0c;咱可以构建自己私有的版本。我分享一个虚拟机硬盘给你&#xff0c;只要你下载下来&#xff0c;通过 VMWare 导入&#xff0c;即可无需任何配置&#xff0c;拿到一个能构建 WPF 官方源代码的全构建环境。可以用来只做你的定制版的 WPF 框架现在 …

基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档 (下篇)

前言回顾上一篇文章《使用Swagger做Api文档 》&#xff0c;文中介绍了在.net core 3.1中&#xff0c;利用Swagger轻量级框架&#xff0c;如何引入程序包&#xff0c;配置服务&#xff0c;注册中间件&#xff0c;一步一步的实现&#xff0c;最终实现生产自动生产API接口说明文档…

C++ vector容器中用erase函数和迭代器删除重复元素问题分析

第一种写法&#xff1a; #include <iostream> #include <vector> using namespace std;int main() {vector<int>v;v.push_back(888);v.push_back(89);v.push_back(89);v.push_back(89);v.push_back(9999);v.push_back(89);for (std::vector<int>::ite…

基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档(上篇)

前言为什么在开发中&#xff0c;接口文档越来越成为前后端开发人员沟通的枢纽呢&#xff1f;随着业务的发张&#xff0c;项目越来越多&#xff0c;而对于支撑整个项目架构体系而言&#xff0c;我们对系统业务的水平拆分&#xff0c;垂直分层&#xff0c;让业务系统更加清晰&…

数据结构-树:根节点、子节点、叶子节点是什么?

前言&#xff1a;这个属于数据结构&#xff1a;树。 下面给个例子图解释&#xff08;根节点、子节点、叶子节点&#xff09;。 上图数字 1、3、7是叶子节点&#xff1b;&#xff08;因为他们下面没有分叉出子节点&#xff0c;所以称为&#xff1a;叶子节点&#xff09;【度为0】…

使用kibana可视化报表实时监控你的应用程序

先结果导向&#xff0c;来看我在kibana dashborad中制作的几张监控图。一&#xff1a;先睹为快1. dashboard1监控几个维度的日志&#xff0c;这么点日志量是因为把无用的清理掉了&#xff0c;而且只接入了部分应用。每日日志总数。每日日志错误数&#xff0c;从log4net中levelE…

[EDA]Quartus II 实验简答题

1&#xff0e;使用 Quartus 编辑波形文件时&#xff0c;界面如下图所示&#xff0c;图中用方框标注的区域&#xff0c;名称是什么&#xff1f;在图中&#xff0c;A、B是输入端口&#xff0c;S是输出端口&#xff0c;要编辑的是哪些信号&#xff1f;为什么。 1&#xff0e;方框标…

基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (补充篇)

前言在上一篇导出文档番外篇中&#xff0c;我们已经熟悉了怎样根据json数据导出word的文档&#xff0c;生成接口文档&#xff0c;而在这一篇&#xff0c;将对上一篇进行完善补充&#xff0c;增加多种导出方式&#xff0c;实现更加完善的导出功能。回顾1. 获取Swagger接口文档的…

[EDA] 给出一个双进程状态机,请把它改为单进程状态机。

给出一个双进程状态机&#xff0c;请把它改为单进程状态机。 解答&#xff1a;

[EDA] 给出一个状态机,请把它的组合进程分为2个,分别命名为COM1和COM2,其中:COM1实现对外的控制信号输出,COM2实现状态译码。

给出一个状态机&#xff0c;请把它的组合进程分为2个&#xff0c;分别命名为COM1和COM2&#xff0c;其中&#xff1a;COM1实现对外的控制信号输出&#xff0c;COM2实现状态译码。 解答&#xff1a;

基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (番外篇)

前言回顾之前的两篇Swagger做Api接口文档&#xff0c;我们大体上学会了如何在net core3.1的项目基础上&#xff0c;搭建一套自动生产API接口说明文档的框架。本来在Swagger的基础上&#xff0c;前后端开发人员在开发生产期间&#xff0c;可以借此进行更加便捷的沟通交流。可是总…

遵守这些原则让你开发效率提高一倍

一、概述在园子里面有很多关于各种技术细节的研究文章&#xff0c;都是比较牛逼的框架研究&#xff1b;但是一直没有看到关于怎么样提高开发效率的文章&#xff0c;大多提高开发效率的文章都是关于自动化等方面的辅助工具类型的&#xff0c;而不是开发中的一些小技巧&#xff1…

【复杂系统迁移 .NET Core平台系列】之调度服务改造

源宝导读&#xff1a;微软跨平台技术框架—.NET Core已经日趋成熟&#xff0c;已经具备了支撑大型系统稳定运行的条件。本文将介绍明源云ERP平台从.NET Framework向.NET Core迁移过程中的实践经验。一、背景随着ERP的产品线越来越多&#xff0c;业务关联也日益复杂&#xff0c;…

C++实现AOE网中的关键路径算法及机动时间计算算法(邻接表存储)

代码如下: #include <iostream> #include <stack> using namespace std; const int N 100;typedef struct Node {int adj;int w;Node *next;}Node;typedef struct VNode {int in;int v;Node *first;VNode(){first nullptr;} }VNode;class AOE { private:VNode a…

.NET 开源项目 StreamJsonRpc 介绍[中篇]

阅读本文大概需要 11 分钟。上一篇介绍了一些预备知识&#xff0c;包括 JSON-RPC 介绍和实现了 JSON-RPC 的 StreamJsonRpc 介绍&#xff0c;讲到了 StreamJsonRpc 可以通过 .NET 的 Stream 类和 WebSocket 类实现 JSON-RPC 协议的通信。本篇就先选择其中的 Stream 类来讲解&am…