C语言普里姆(Prim)算法实现计算国家建设高铁运输网最低造价的建设方案

背景:

描述:为促进全球更好互联互通,亚投行拟在一带一路沿线国家建设高铁运输网,请查阅相关资料
画出沿线国家首都或某些代表性城市的连通图,为其设计长度最短或造价最低的高铁建设方案。 要求:抽象出的图中顶点不少于10个,边不少于15条,边的权值代表各国家城市间的高铁长度或造价(假设1公里高铁的造价为人民币1亿元)

 操作提示::
(1)抽象出无向网画出代表各个国家城市名、城市之间连通线路及其造价的无向网; (2)输入初始数据:首先从终端分别输入顶点及边的总数,然后输入各顶点名(各个国家城市的名 称),再输入顶点之间的连通线路及其权值(相关城市名、长度或造价),建立无线网(建议:为节省
输入时间和测试数据准确性,采用读入文本文件的方式输入原始数据);
(3)求解最小生成树:利用普里姆(Prim)算法或克鲁斯卡尔(Kruskal)算法求解连通图的最小生
成树; (4)输出最小生成树:以<城市名1,城市名2,长度或造价>方式依次输出连通所有城市的高铁网最短长度或最低造价的建设方案。

界面展示:

我们使用下图标出地点进行模拟

过程分析:

  1. 最小生成树简介 最小生成树是一张连通图的所有顶点构成的树,它包含了图中所有顶点,并且边的权值之和最小。最小生成树的一个重要性质是它不包含任何形成环路的边,因此可以保证生成树的连通性。

  2. Prim算法原理 Prim算法采用贪心策略,从一个起始顶点开始,逐步扩展生成树,直到所有顶点都被加入。其基本思想是每次选择一个与当前已选中的顶点集合相邻且权值最小的边,将其加入生成树中。具体步骤如下:

    1. 任选一个起始顶点,将其加入生成树中。
    2. 找到与生成树中的顶点相邻的所有边,并筛选出其中权值最小的边。
    3. 将上一步中找到的边所连接的顶点加入生成树中。
    4. 重复第2步和第3步,直到所有顶点都被加入。
  3. Prim算法实例演示 以一个简单的图为例,我们来演示Prim算法的执行过程。假设有如下图所示的带权无向连通图:

从顶点A开始,我们将它加入生成树。然后选取与A相邻且权值最小的边(AB权值为5),将顶点B加入生成树。继续选择与生成树相邻且权值最小的边(CA权值为7),将顶点C加入生成树。接着选择CD边(权值为2),将顶点D加入生成树。最后选择DE边(权值为4),将顶点E加入生成树。此时所有顶点都已经加入,生成树构建完毕。

      5.Prim算法的适用性和效率分析 Prim算法适用于解决稠密图的最小生成树问题,因为其时间复杂度为O(n^2),其中n为顶点数。在稠密图中,顶点之间的边比较多,因此Prim算法相对高效。而对于稀疏图,Kruskal算法可能更加适用,因为Kruskal算法的时间复杂度为O(eloge),其中e为边数。在实际应用中,可以根据具体问题的特点选择合适的算法。

总结:

Prim算法是一种常用的贪心算法,用于求解最小生成树问题。通过选择与当前已选中的顶点集合相邻且权值最小的边,逐步扩展生成树,并保证生成树的连通性和权值最小。希望本文能够帮助读者更好地理解和运用Prim算法,解决实际问题中的最小生成树需求。

源码获取:

void Prim(MGraph g,int v) {  //传入一个邻接矩阵,和起始顶点
    int lowcost[MAXV];
    int closest[MAXV];
    int min;
	int i,j,k = 0;
    for (i=0; i<g.n; i++) {          //给lowcost[]和closest[]置初值
        lowcost[i]=g.edges[v][i];
        closest[i]=v;
    }

inMST[u] = true;
for (int v = 0; v < V; v++) {
if (adjMatrix[u][v] != INF && !inMST[v] && adjMatrix[u][v] < key[v]) {
    key[v] = adjMatrix[u][v];
    pq.push(make_pair(key[v], v));
    parent[v] = u;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux-进程之间的通信

目录 ​编辑 一.什么是进程之间的通信 二.进程之间的通信所访问的数据 三.进程之间的通信是如何做到的 四.基于内存文件级别的通信方式——管道 1.什么是管道 2.管道的建立过程——匿名管道 a.什么是匿名管道 b.匿名管道特点&#xff1a; c.使用匿名管道的…

Peter算法小课堂—贪心算法

课前思考&#xff1a;贪心是什么&#xff1f;贪心如何“贪”&#xff1f; 课前小视频&#xff1a;什么是贪心算法 - 知乎 (zhihu.com) 贪心 贪心是一种寻找最优解问题的常用方法。 贪心一般将求解过程分拆成若干个步骤&#xff0c;自顶向下&#xff0c;解决问题 太戈编程第…

邮政单号查询,邮政快递物流查询,并进行提前签收分析

批量查询邮政快递单号的物流信息&#xff0c;并将提前签收件分析筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 邮政快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的朋友记得先注册&#xff0c…

关于svn如何上传一个完整的项目

注意&#xff1a;请一定要按照该步骤进行操作&#xff0c;请上传新项目时将项目名称进行规范命名 例如原始文件是arrange_v2 将此项目需要注入新的医院 则命名为 arrange_某医院名称_门诊或者医技或者药房_v2 重新命名文件夹名称快捷键 &#xff08;F12&#xff09; 一 &…

【Linux】公网远程访问AMH服务器管理面板

目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6. 固定AMH面板公网地址 AMH 是一款基于 Linux 系统的服务器管理面板&#xff0c;它提供了一系列的功能&#xff0c;包括网站管理、FTP 管理、数据库管理、DNS 管理、…

UI自动化测试工具的定义及重要性

UI自动化测试工具在现代软件开发中起着不可或缺的作用。它们能够提高测试效率、减少人为错误、提供全面的测试覆盖&#xff0c;并支持持续集成。通过有效使用UI自动化测试工具&#xff0c;开发团队可以提高软件质量&#xff0c;提供更可靠的应用程序&#xff0c;满足用户的需求…

Jsoup爬取HTTPS页面数据资源,并导入数据库(Java)

一、实现思路 示例页面&#xff1a; 2020年12月中华人民共和国县以上行政区划代码 忽略https请求的SSL证书通过Jsoup获取页面标签遍历行标签&#xff0c;分别获取每个行标签的第二个和第三个列标签将获取到的行政代码和单位名称分别插入sql语句占位符执行sql语句&#xff0c…

掌汇云 | 全场景数据追踪,多维了解用户偏好,提高运营效率

掌汇云拥有黄金“三件套”&#xff1a;掌头条、汇互动、云品牌。群硕借助这些功能套件&#xff0c;面向细分领域如&#xff1a;会展&#xff0c;食品饮料、医药以及工业等&#xff0c;定制综合性信息服务平台&#xff0c;提供资讯、商机、企业人脉、上下游资源、活动等高质量服…

<软考>软件设计师-3程序设计语言基础(总结)

(一) 程序设计语言概述 1 程序设计语言的基本概念 1-1 程序设计语言的目的 程序设计语言是为了书写计算机程序而人为设计的符号语言&#xff0c;用于对计算过程进行描述、组织和推导。 1-2 程序语言分类 低级语言 : 机器语言&#xff08;计算机硬件只能识别0和1的指令序列)&…

docker网络【重点】

一、网络知识 1、桥接模式&#xff1a;用于链接两个不同网络段的设备&#xff0c;是共享通信的一种方式 2、桥接设备&#xff1a;工作在OSI模型的第二层&#xff08;数据链路层&#xff09;。根据MAC地址转发数据帧&#xff0c;类似于交换机&#xff0c;只能转发同一网段&…

使用Inno Setup 打包程序文件 怎么把其中一个文件安装时复制到指定系统文件夹

环境: Inno Setup 6.6 Win10 专业版 问题描述: 使用Inno Setup 打包程序文件 怎么把其中一个文件安装时复制到指定系统文件夹 将文件api-ms-win-shcore-scaling-l1-1-1.dll复制到system32里面 解决方案: 1.由于安全和权限的限制,直接在Inno Setup脚本中复制文件到C:\…

Mysql综合案例练习<1>

MySql综合案例练习<1> 题目一题目二题目三题目四题目五题目六题目七题目八题目九题目十题目十一题目十二题目十三题目十四题目十五题目十六题目十七题目十八题目十九 题目一 创建数据库test01_library 创建表 books&#xff0c;表结构如下&#xff1a; CREATE DATABASE …

Tap虚拟网卡

1 概述 Tap设备通常用于虚拟化场景下&#xff0c;其驱动代码位于drivers/net/tun.c&#xff0c;tap与tun复用大部分代码&#xff0c; 注&#xff1a;drivers/net/tap.c并不是tap设备的代码&#xff0c;而是macvtap和ipvtap&#xff1b; 下文中&#xff0c;我们统一称tap&#…

了解Linux网络配置

本章主要介绍网络配置的方法。 网络基础知识 查看网络信息 图形化界面修改 通过配置文件修改 命令行管理 11.1 网络基础知识 一台主机需要配置必要的网络信息&#xff0c;才可以连接到互联网。需要的配置网络信息包括IP、 子网掩码、网关和 DNS。 11.1.1 IP 地址 在计算机…

0010Java安卓程序设计-ssm基于安卓的掌上校园系统

文章目录 **摘要**目录系统实现5.2管理员功能模块开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘要 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;…

【Java系列】函数式接口编程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【redis笔记】redis应用

redis应用 redis 发布订阅 redis客户端可以订阅任意数量的频道 订阅方式 subscribe channel1 – 订阅了channel1频道 发布方式 订阅了之后&#xff0c;可以在任意客户端发布消息到指定channel publish channel1 hello – 往channel发布hello&#xff0c;会返回订阅channe…

class036 二叉树高频题目-上-不含树型dp【算法】

class036 二叉树高频题目-上-不含树型dp code1 102. 二叉树的层序遍历 // 二叉树的层序遍历 // 测试链接 : https://leetcode.cn/problems/binary-tree-level-order-traversal/ code1 普通bfs code2 一次操作一层 package class036;import java.util.ArrayList; import java…

9. 使用Pthreads实现线程池(一)

背景 多线程的一个典型应用场景就是服务器的并发处理,如下图所示,多名用户向服务器发出数据操作的请求。为了提高并发性,我们可以在每收到一个用户请求时就创建一个线程处理相关操作。这种操作在请求数量较少时没有什么问题,但在请求数量很多时你会发现线程的创建和销毁所占…