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

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,一经查实,立即删除!

相关文章

[深度学习] 无人车避开赛道边的障碍物

https://developer.horizon.cc/forumDetail/146176821770230117 https://developer.horizon.cc/nodehubdetail/184587678518566921 https://developer.horizon.ai/forumDetail/185446132959372300 https://developer.horizon.ai/forumDetail/185446371330059463 用精灵标注助手…

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

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

C语言 知识点 + 笔记(2w7千字 持续更新...)

目录 前言 第 1 章 C语言的流程 计算机基础 (1) 十进制转 N 进制 例1 十进制转二进制 例2 十进制转八进制 例3 十进制十六进制 (2) N进制 转十进制 例1 二进制转十进制 例2 八进制转十进制 例3 十六进制转十进制 (3) 原码反码补码 第 2 章 数据类型、运算符和表达…

k8s-pod设置执行优先级

Pod的优先级管理是Kubernetes调度中的一个重要特性&#xff0c;通过PriorityClass&#xff08;优先级类&#xff09;的设置&#xff0c;我们可以为Pod指定不同的优先级&#xff0c;从而在资源有限的情况下更精细地调整调度顺序 什么是PriorityClass&#xff1f; PriorityClass是…

【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;我们需要知道几…

加密行业4大新趋势:Restaking、Layer3、AI、DePin

Web3经济是由用例、创新、炒作和趋势驱动的&#xff0c;而用户活动构成了这些驱动力的基础&#xff0c;也是评估加密项目或板块增长潜力的关键指标。趋势造就了加密市场的热点&#xff0c;并推动市场周期的价格发现。 上一次牛市周期&#xff0c;我们见证了元宇宙和NFT项目的爆…

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

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

【算法刷题 day23】Leetcode: 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 文档链接&#xff1a;[代码随想录] 题目链接&#xff1a; 669. 修剪二叉搜索树 题目&#xff1a; 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树…

开发有哪些常见陷阱?

引言 在当今数字化时代&#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科技 提供 前几…

数据中心如何选择万兆光模块?

在数据中心的网络架构中&#xff0c;选择适合的万兆光模块是至关重要的。在选择过程中&#xff0c;万兆多模光模块、万兆电口模块和10G DAC是三种常见的方案。万兆光模块的选择直接关系到数据传输的速度、稳定性和成本效益。在选择过程中&#xff0c;我们可以从延迟、功耗、应用…

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…