数据结构课程设计(七)---求图的中心顶点 [图]

1.7.1 题目内容
1.7.1-A [问题描述]

假设有一个公司在某个地区有n个产品销售点,现根据业务需要打算在其中某个销售点上建立一个中心仓库,负责向其它销售点提供产品。由于运输线路不同,运输费用也不同。假定每天需要向每个销售点运输一次产品,那么应将中心仓库建在哪个销售点上,才能使运输费用达到最低。

【问题分析】这是一个求图的中心顶点的问题:即在一个带权图G中,求出这样一个顶点v,使得v到其余顶点的最短路径长度之和最小。首先用弗罗伊德算法求出各个顶点之间的最短路径长度,然后再求出每个顶点到其余各顶点的最短路径长度之和,从中选取一个最短路径长度之和最小的顶点。

1.7.1-B [基本要求]

(1)输入格式:

输入第一行为两个正整数n和e,分别表示图的顶点数和边数,其中n不超过15000,e不超过1000。接下来e行表示每条边的信息,每行为3个非负整数a、b、c,其中a和b表示该边的端点编号,c表示权值。各边并非按端点编号顺序排列。

2)输出格式:

输出两个正整数,分别表示中心顶点编号、最小总路径。

1.7.2 算法思想

这段代码实现了弗洛伊德算法,用于求解有向图中任意两点之间的最短路径。该算法采用动态规划的思想,通过三重循环计算出任意两点之间的最短路径。CreateGraph函数实现创建图,Floyd函数实现弗洛伊德算法,Set_Color函数实现设置字体颜色,使交互界面更加美观

1.7.3 数据结构

结构体申明如下:

1.7.3-A Gnode

typedef struct Gnode

{

    int n;  // 顶点数

    int e;  // 边数

    int weigh[MAX][MAX];

} Gnode;

#include<iostream>
#include <windows.h>
using namespace std;#define MAX 15000
#define INFINITY 200001typedef struct Gnode 
{int n;  // 顶点数int e;  // 边数int weigh[MAX][MAX];
} Gnode;//设置字体颜色 
void Set_Color(int x);//创建有向图 
Gnode* CreateGraph();//弗洛伊德算法 
void Floyd(Gnode* Graph,int a[MAX][MAX],int path[MAX][MAX]);int a[MAX][MAX]; 
int path[MAX][MAX];int main() 
{int minn=INFINITY;int sum=0;int ans=-1;Gnode* Graph = CreateGraph();Floyd(Graph,a,path);Set_Color(11);cout << "最短路径矩阵:" << endl;for (int i = 0; i < Graph->n; i++) {for (int j = 0; j < Graph->n; j++) {cout << a[i][j] << " ";if(i!=j)sum+=a[i][j];}if(sum<minn){minn=sum;ans=i;}sum=0;cout << endl;}Set_Color(14);cout<<"中心顶点编号为:"<<ans<<" "<<"最小总路径为:"<<minn; delete Graph;return 0;
}//设置字体颜色 
void Set_Color(int x)
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);//此函数可控制字体颜色,颜色对应列表如下所示/*color(0);printf(“黑色\n”);color(1);printf(“蓝色\n”);color(2);printf(“绿色\n”);color(3);printf(“湖蓝色\n”);color(4);printf(“红色\n”);color(5);printf(“紫色\n”);color(6);printf(“黄色\n”);color(7);printf(“白色\n”);color(8);printf(“灰色\n”);color(9);printf(“淡蓝色\n”);color(10);printf(“淡绿色\n”);color(11);printf(“淡浅绿色\n”);color(12);printf(“淡红色\n”);color(13);printf(“淡紫色\n”);color(14);printf(“淡黄色\n”);color(15);printf(“亮白色\n”);在0-15范围修改的是字体的颜色超过15改变的是文本背景色*/
}//创建无向图 
Gnode* CreateGraph() 
{int v1, v2, w;Gnode* Graph = new Gnode;Set_Color(15);cout << "请输入图的顶点数和边数:";cin >> Graph->n >> Graph->e;if(Graph->n>MAX){Set_Color(4);cout<<"错误!输入的顶点数超过了最大值15000"<<endl;exit(0); }if(Graph->e>1000){Set_Color(4);cout<<"错误!输入的边数超过了最大值1000"<<endl;exit(0); }for (int i = 0; i < Graph->n; i++) {for (int j = 0; j < Graph->n; j++) {Graph->weigh[i][j] = INFINITY;  // 初始化边权值为无穷大}}cout << "请输入边的起点,终点和权值,以空格分隔" << endl;for (int i = 0; i < Graph->e; i++) {cin >> v1 >> v2 >> w;if(v1>=Graph->n||v1<0){Set_Color(4);cout<<"错误!起点的值输入有误"<<endl;exit(0);}if(v2>=Graph->n||v2<0){Set_Color(4);cout<<"错误!终点的值输入有误"<<endl;exit(0);}if(w<=0){Set_Color(4);cout<<"错误!正权有向图权值不能为非正数"<<endl;exit(0);}Graph->weigh[v1][v2] = w;Graph->weigh[v2][v1] = w;}return Graph;
}//弗洛伊德算法 
void Floyd(Gnode* Graph,int a[MAX][MAX],int path[MAX][MAX])
{//初始化数组a,pathfor(int i=0;i<Graph->n;i++){for(int j=0;j<Graph->n;j++){a[i][j]=Graph->weigh[i][j];if(a[i][j]<INFINITY){path[i][j]=i;}else{path[i][j]=-1;}} }//三重循环计算a[i][j]//做中转点的编号for(int k=0;k<Graph->n;k++){ //起点编号 for(int i=0;i<Graph->n;i++){//终止点编号for(int j=0;j<Graph->n;j++){ if(a[i][j]>a[i][k]+a[k][j]){a[i][j]=a[i][k]+a[k][j];path[i][j]=k;} }}}
}
1.7.5 测试数据与运行结果
1.7.5-A 测试数据

输入:

6 9

0 1 6

0 2 2

0 3 7

1 2 3

1 4 1

2 3 4

2 5 2

3 5 10

4 5 4

输出:

2 15

1.7.5-B 运行结果

1.7.6 时间复杂度

时间复杂度为O(n^3)。

源码地址:GeekclubC/Course-Design-of-Data-Structure: 用C++完成的数据结构课程设计 (github.com)

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

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

相关文章

伪装目标检测论文阅读之:《Confidence-Aware Learning for Camouflaged Object Detection》

论文地址&#xff1a;link code:link 摘要&#xff1a;   任意不确定性捕获了观测结果中的噪声。对于伪装目标检测&#xff0c;由于伪装前景和背景的外观相似&#xff0c;很难获得高精度的注释&#xff0c;特别是目标边界周围的注释。我们认为直接使用“嘈杂”的伪装图进行训…

【InternLM 实战营第二期-笔记1】书生浦语大模型开源体系详细介绍InternLM2技术报告解读(附相关论文)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型,很高兴能参与本次第二期训练营&#xff0c;我也将会通过笔记博客的方式记录学习的过程与遇到的问题&#xff0c;并为代码添加注释&#xff0c;希望可以帮助到你们。 记得点赞哟(๑ゝω╹๑) 书生浦语大模型开源体系…

Zookeeper中的节点类型和实现持久化的两种方式

进入zookeeper的bin目录&#xff0c;执行./zkServer.sh start ../conf/zoo.cfg启动&#xff01; Zookeeper内部的数据模型 类似于数据结构中的树&#xff0c;同时也很像文件系统的目录&#xff0c; 节点的类型 持久节点&#xff1a;create /znode 创建出的节点&#xff0c…

Shell脚本学习(一):Shell入门与Shell变量

Shell学习章节目录 Shell入门与Shell变量。 Shell内置命令。 Shell运算符与执行运算命令。 流程控制语句。 Shell函数。 Shell重定向。 Shell好用的工具&#xff0c;cut sed awk sort。 大厂常见企业面试题。 Shell入门&#xff1a;介绍 对于入门&#xff0c;我们需要知道几…

2011年认证杯SPSSPRO杯数学建模A题(第一阶段)客机水面迫降时的姿态全过程文档及程序

2011年认证杯SPSSPRO杯数学建模 A题 客机水面迫降时的姿态 原题再现&#xff1a; 2009 年 1 月 15 日下午&#xff08;美国东部时间&#xff09;&#xff0c;US Airways 所属第 1549 航班&#xff08;空中客车 A320 客机&#xff09;在起飞后不久在纽约哈德逊河紧急迫降。经及…

开发有哪些常见陷阱?

引言 在当今数字化时代&#xff0c;软件开发已成为推动科技进步和商业发展的重要引擎。然而&#xff0c;软件开发并非一帆风顺&#xff0c;其中蕴藏着许多陷阱和挑战。如何避免这些陷阱&#xff0c;提高软件开发的效率和质量&#xff0c;成为开发者们面临的重要问题 本文将深…

【linux深入剖析】动态库的使用(续) | 动静态库的链接

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 回顾1. 打包库的使用2. 动…

智能体Agent是AI时代普通人可参与的第一个红利机会

自从生成式 AI 兴起&#xff0c;掌握 prompt 能让 AI 工具更好为我们服务。而智能体的出现&#xff0c;让 AI 的使用门槛更是不断降低——都不用写 Prompt 了&#xff0c;直接用智能体就行了。 智能体Agent是AI时代普通人可参与的第一个红利机会© 由 ZAKER科技 提供 前几…

ActiveMQ 01 消息中间件jmsMQ

消息中间件之ActiveMQ 01 什么是JMS MQ 全称&#xff1a;Java MessageService 中文&#xff1a;Java 消息服务。 JMS 是 Java 的一套 API 标准&#xff0c;最初的目的是为了使应用程序能够访问现有的 MOM 系 统&#xff08;MOM 是 MessageOriented Middleware 的英文缩写&am…

4.9总结(Stream流,方法引用概述 || 乘法逆元,组合数)

Stream流 基本概念&#xff1a;以更简便的方式操作集合数据的形式&#xff1b; Steam流的操作步骤&#xff1a; 获取Stream流 中间方法&#xff1a;去重&#xff0c;跳过&#xff0c;获取&#xff0c; 过滤&#xff0c; 合并流&#xff0c;转换类型&#xff1b; 终结方法&…

2024-4-12-实战:商城首页(下)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业小结 作业 .bg-backward {width: 60px; height: 60px;background: url(..…

SpringMVC--02--上下文工具类(RequestContextHolder)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 RequestContextHolder背景1.RequestContextHolder的使用2.request和response怎么和当前请求挂钩?3.request和response等是什么时候设置进去的? 案例应用---用户信…

最新常见的图数据库对比,选型,架构,性能对比

图数据库排名 地址&#xff1a;https://db-engines.com/en/ranking/graphdbms 知识图谱查询语言 SPARQL、Cypher、Gremlin、PGQL 和 G-CORE 语法 / 语义 / 特性SPARQLCypherGremlinPGQLG-CORE图模式匹配查询语法CGPCGPCGP(无可选)1CGPCGP语义子图同态、包 2无重复边、包 2子…

C语言之九九乘法表||素数||最小公倍数

一、九九乘法表 &#xff08;1&#xff09;思路 1、九九乘法表中存在三个变量&#xff0c;以 x1 ; x2 ; y 为例&#xff08;这里也可以使用两个变量&#xff0c;用x1和x2来表示y&#xff0c;方法一样&#xff09; 2、想好了变量之后&#xff0c;我们要想怎样将他实现呢&#x…

智能售货机:引领便捷生活

智能售货机&#xff1a;引领便捷生活 在这个科技迅速进步的时代&#xff0c;便捷已成为生活的必需。智能售货机作为技术与便利完美结合的产物&#xff0c;正逐渐改变我们的购物方式&#xff0c;为都市生活增添新的活力。 智能售货机的主要优势是它的极致便利性。不论是在地铁…

变量---

一、变量概述 1、什么是变量 变量是用于存放数据的容器。通过变量名 获取数据&#xff0c;甚至数据可以修改。 变量的本质&#xff1a;变量是程序在内存中申请的一块用来存放数据的空间。 二、变量的使用 变量在使用时分两步&#xff1a;1、声明变量 2、赋值 三、变量语法…

【c 语言】结构体的定义格式及变量初始化

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

Vue2 —— 学习(三)

目录 一、绑定 class 样式 &#xff08;一&#xff09;字符串写法 1.流程介绍 2.代码实现 &#xff08;二&#xff09;数组写法 1.流程介绍 2.代码实现 &#xff08;三&#xff09;对象写法 1.流程介绍 2.代码实现 二、绑定 style 样式&#xff08;了解&#xff…

备忘录模式:恢复对象状态的智能方式

在软件开发中&#xff0c;备忘录模式是一种行为型设计模式&#xff0c;它允许捕获并外部化对象的内部状态&#xff0c;以便在未来某个时刻可以将对象恢复到此状态。这种模式是撤销操作或者回滚操作的关键实现机制。本文将详细介绍备忘录模式的定义、实现、应用场景以及优缺点。…

【linux深入剖析】深入理解基础外设--磁盘以及理解文件系统

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 前言1.磁盘物理结构2.磁盘…