求解建公路问题

课程设计题目

求解建公路问题


课程设计目的

深入掌握 Prim 和 Kruskal算法在求解实际问题中的应用


问题描述 

        假设有 n 个村庄,编号从到,现在修建一些道路使任意两个村庄之间可以互相连通。所谓两个村庄 A 和B是连通的,指当且仅当A 和 B之间有一条道路或者存在一个村庄 C 使得 A 和C之间有一条道路并且C和B是连通的。有一些村庄之间已经存在一些道路,这里的工作是建造一些道路以使所有村庄都连通,并且所有道路的长度最小。

        测试数据存放在 datal4.txt 文件中,第一行是整数n(3≦n100)它是村庄的数量然后是n 行,其中第行包含 个整数,而这n 个整数中的第个表示村庄与村庄j之间的距离(该距离应为[1,1000]的整数); 然后有一个整数 q(0qn(n+1)/2); 接下来有行,每行包含两个整数a 和b(1 a bn),这意味着已经建立了村庄 a 和村b 之间的道路。例如,data14.txt 的数据如下:

3

0 990 692

990 0 179

692 179 0

1

1 2


源程序

#include <iostream>
#include <cstring>
#include<vector>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXV 105 
int mat[MAXV][MAXV];
int U[MAXV];
int lowcost[MAXV];
int n;int Prim()									//解法1:Prim算法求顶点1出发的最小生成树的权值和
{	memset(U,0,sizeof(U));memset(lowcost,0x3f,sizeof(lowcost));int ans=0;								//存放结果lowcost[1]=0;for(int i=1;i<=n;i++){	int minc=INF,k=0;for(int j=1;j<=n;j++)					//在(V-U)中找出离U最近的顶点kif(!U[j] && lowcost[j]<minc){	minc=lowcost[j];k=j;}ans+=minc;							//累计最小生成树的边权U[k]=1;								//标记k已经加入Ufor(int i=1;i<=n;i++)					//调整if(U[i]==0 && lowcost[i]>mat[k][i])lowcost[i]=mat[k][i];}return ans;
}
//----并查集基本运算算法 
int parent[MAXV];							//并查集存储结构
int rnk[MAXV];								//存储结点的秩
void Init(int n)								//并查集初始化
{	for (int i=1;i<=n;i++)						//顶点编号1到n {	parent[i]=i;rnk[i]=0;}
}
int Find(int x)								//并查集中查找x结点的根结点
{	if (x!=parent[x])parent[x]=Find(parent[x]);			//路径压缩return parent[x];
}
void Union(int x,int y)						//并查集中x和y的两个集合的合并
{	int rx=Find(x);int ry=Find(y);if (rx==ry)								//x和y属于同一棵树的情况return;if (rnk[rx]<rnk[ry])parent[rx]=ry;						//rx结点作为ry的孩子 else{	if (rnk[rx]==rnk[ry])					//秩相同,合并后rx的秩增1rnk[rx]++;parent[ry]=rx;						//ry结点作为rx的孩子}
}
struct Edge								//边向量元素类型
{	int u;									//边的起始顶点int v;									//边的终止顶点int w;									//边的权值Edge(int u,int v,int w)					//构造函数{	this->u=u;this->v=v;this->w=w;}bool operator<(const Edge &s) const		//重载<运算符{return w<s.w;						//用于按w递增排序}
};
int Kruskal()								//解法2:改进的Kruskal算法求最小生成树的权值和
{	int ans=0;vector<Edge> E;							//建立存放所有边的向量Efor (int i=1;i<=n;i++)						//由图的邻接矩阵g产生边向量Efor (int j=1;j<=n;j++)if (i<j)E.push_back(Edge(i,j,mat[i][j]));sort(E.begin(),E.end());					//对E按权值递增排序Init(n);									//并查集初始化int k=1;									//k表示当前构造生成树的第几条边,初值为1int j=0;									//E中边的下标,初值为0while (k<n)								//生成的边数小于n时循环{	int u1=E[j].u;int v1=E[j].v;						//取一条边的起始和终止顶点int sn1=Find(u1);int sn2=Find(v1);					//分别得到两个顶点所属的集合编号if (sn1!=sn2)							//两顶点属于不同的集合,该边是最小生成树的一条边{	ans+=E[j].w;					//累计最小生成树的边权k++;							//生成边数增1Union(sn1,sn2);					//合并}j++;									//扫描下一条边}return ans;
}
int main()
{freopen("data14.txt","r",stdin);	//输入重定向 scanf("%d",&n);printf("村庄n=%d\n",n);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&mat[i][j]);printf("邻接矩阵\n"); for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)printf("%4d ",mat[i][j]);printf("\n");}int k;scanf("%d",&k);printf("已经建好如下%d条道路\n",k);for(int i=0;i<k;i++){	int a,b;scanf("%d%d",&a,&b);printf("  (%d,%d)\n",a,b);mat[a][b]=mat[b][a]=0;}printf("求解结果\n"); printf("  解法1: %d\n",Prim());printf("  解法2: %d\n",Kruskal());return 0;
}

数据及结果分析

 

求解建公路问题可以使用Prim算法和Kruskal算法。这两种算法都是基于贪心的思想,通过不断选择最小权重的边来构建最小生成树。

1. Prim算法:

   - 数据结构:使用邻接矩阵或邻接表表示图。

   - 算法设计:

     1) 初始化一个空的最小生成树集合M,将起点加入M。

     2) 从M中选取一条权值最小的边(u, v),将v加入M。

     3) 更新与v相邻的未被加入M的顶点的权值,并选取权值最小的边(u, w),将w加入M。

     4) 重复步骤2和3,直到M包含所有顶点。

2. Kruskal算法:

   - 数据结构:使用邻接表表示图。

   - 算法设计:

     1) 将所有边按照权值从小到大排序。

     2) 初始化一个空的最小生成树集合M。

     3) 遍历排序后的边,对于每条边(u, v),如果u和v不在同一个连通分量中,则将边(u, v)加入M,并将u和v所在的连通分量合并。

     4) 重复步骤3,直到M包含所有顶点。

在实际应用中,可以根据具体问题选择合适的算法。例如,如果图是稀疏的,可以使用邻接表表示图,从而减少存储空间和计算时间;如果需要快速找到最小生成树,可以使用Prim算法。

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

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

相关文章

QT通过QPdfWriter类实现pdf文件生成与输出

一.QPdfWriter类介绍 本文代码工程下载地址&#xff1a; https://download.csdn.net/download/xieliru/88736664?spm1001.2014.3001.5503 QPdfWrite是一个用于创建PDF文件的类&#xff0c;它是Qt库的一部分。它提供了一些方法和功能&#xff0c;使您能够创建和写入PDF文件。…

#Prompt##提示词工程##AIGC##LLM#使用大型预训练语言模型的关键考量

如果有不清楚的地方可以评论区留言&#xff0c;我会给大家补上的&#xff01; 本文包括&#xff1a; Prompt 的一些行业术语介绍 Prompt 写好提示词的方法经验介绍&#xff08;附示例教程&#xff09; LLM自身存在的问题&#xff08;可以用Prompt解决的以及无法用Prompt解决的&…

u盘监控系统—公司电脑如何监控U盘使用?【详解】

在当今的办公环境中&#xff0c;U盘等移动存储设备已成为数据传输和存储的重要工具。 然而&#xff0c;随着U盘的广泛使用&#xff0c;也带来了潜在的安全风险&#xff0c;如数据泄露、病毒传播等。 因此&#xff0c;对于随时会有数据泄露风险的企业而言&#xff0c;U盘的使用…

DrissionPage获取浏览器Network数据包

DrissionPage是什么&#xff1f; GitHub - g1879/DrissionPage: 基于python的网页自动化工具。既能控制浏览器&#xff0c;也能收发数据包。可兼顾浏览器自动化的便利性和requests的高效率。功能强大&#xff0c;内置无数人性化设计和便捷功能。语法简洁而优雅&#xff0c;代码…

深度学习基本介绍-李沐

目录 AI分类&#xff1a;模型分类&#xff1a;广告案例&#xff1a; bilibili视频链接&#xff1a;https://www.bilibili.com/video/BV1J54y187f9/?p2&spm_id_frompageDriver&vd_sourcee6a6e7fec41c59c846c142eb5ef1da0b AI分类&#xff1a; 模型分类&#xff1a; 图…

【每日一题】删除排序链表中的重复元素

文章目录 Tag题目来源解题思路方法一&#xff1a;比较相邻两节点 写在最后 Tag 【遍历】【链表】【2024-01-14】 题目来源 83. 删除排序链表中的重复元素 解题思路 方法一&#xff1a;比较相邻两节点 思路 比较两个相邻的节点&#xff0c;如果下一个节点值和当前节点值一样…

简单高效 LaTeX 科学排版 第004集 命令与环境

这是《简单高效LaTeX》的第四个视频&#xff0c;主要演示讨论基本命令与排版环境&#xff0c;还有保留字符。 视频地址&#xff1a;https://www.ixigua.com/7298100920137548288?id7298102807985390120&logTagf853f23a668f8a2ee405

IPv6组播技术--MLDv2

MPLDv1工作机制 IPv6组播网络中RouterA和RouterB连接主机网段,在主机网段上有HostA、HostB、HostC三个接收者。假设HostA和HostB想要接收发往组播组G1的数据,HostC想要接收发往组播组G2的数据。 查询器选举机制 当一个网段内有多台IPv6组播路由器时,由于它们都可以接收到…

初识XSS漏洞

目录 一、XSS的原理和分类 二、Xss漏洞分类 1. 反射性xss 简单的演示&#xff1a; 2.基于DOM的XSS 简单的演示&#xff1a; 3.存储型XSS ​编辑简单的演示 4、self xss 三、XSS漏洞的危害 四、XSS漏洞的验证 五、XSS漏洞的黑盒测试 六、XSS漏洞的白盒测试 七、XS…

html+JavaScript的媒体元素

<video src"conference.mpg" id"myVideo">Video player not available.</video> <!-- 嵌入音频 --> <audio src"song.mp3" id"myAudio">Audio player not available.</audio> - 属性 每个元素至少…

JavaScript深拷贝与浅拷贝的全面解析

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ 目录 ✨ 前言 ✨ 正文 浅拷贝 对象的浅拷贝 数组的浅拷贝 浅拷贝的问题 深拷贝 什么是深拷贝…

如何激活数据要素价值

文章目录 前言一、数据作为生产要素的背景二、数据作为新型生产要素&#xff0c;是价值创造的重要源泉&#xff08;一&#xff09;生产要素是经济活动中的基本要素&#xff08;二&#xff09;激活数据要素价值&#xff0c;要从理论上认识数据要素的基本特征&#xff08;三&…

CMU15-445-Spring-2023-Project #2 - B+Tree

前置知识&#xff1a;参考上一篇博文 CMU15-445-Spring-2023-Project #2 - 前置知识&#xff08;lec07-010&#xff09; CHECKPOINT #1 Task #1 - BTree Pages 实现三个page class来存储B树的数据。 BTree Page internal page和leaf page继承的基类&#xff0c;只包含两个…

C语言辨析——深入理解字符常量与表达式

1. 问题 今天看到一个题目&#xff0c;截图如下。 从答题情况来看&#xff0c;本题的答案是B&#xff0c;那么就意味着A、C、D是错的。但我认为这4个选项都是对的。当然&#xff0c;如果要从4个选项中挑选一个的话&#xff0c;那还是选择B妥当一些。 2. 分析 字符常量的定义…

【漏洞复现】优卡特脸爱云一脸通智慧管理平台权限绕过漏洞CVE-2023-6099(1day)

漏洞描述 脸爱云一脸通智慧管理平台1.0.55.0.0.1及其以下版本SystemMng.ashx接口处存在权限绕过漏洞,通过输入00操纵参数operatorRole,导致特权管理不当,未经身份认证的攻击者可以通过此漏洞创建超级管理员账户。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当…

CAN总线报文格式———扩展数据帧

扩展数据帧由帧起始、仲裁段、控制段、数据段、CRC段、ACK段、帧结束等组成。 一、总线空闲&#xff08;Bus Idle&#xff09; CAN总线空闲时&#xff0c;总线上会输出持续的高电平“1”。当总线空闲时任何连接的单元都可以开始发送新的报文。 二、帧起始&#xff08;Start o…

鱼哥赠书活动第⑤期:《ATTCK视角下的红蓝对抗实战指南》《智能汽车网络安全权威指南》上下册 《构建新型网络形态下的网络空间安全体系》《Kali Linux高级渗透测试》

鱼哥赠书活动第⑤期&#xff1a; 《ATT&CK视角下的红蓝对抗实战指南》1.1介绍&#xff1a; 《智能汽车网络安全权威指南》上册1.1介绍&#xff1a; 《智能汽车网络安全权威指南》下册1.1介绍&#xff1a; 《构建新型网络形态下的网络空间安全体系》1.1介绍&#xff1a; 《K…

遭受慢速连接攻击怎么办?怎么预防

慢速连接攻击是一种常见的网络攻击方式&#xff0c;其原理是利用HTTP协议的特性&#xff0c;在建立了与Http服务器的连接后&#xff0c;尽量长时间保持该连接&#xff0c;不释放&#xff0c;达到对Http服务器的攻击。 慢速连接攻击的危害包括以下几个方面&#xff1a; 1.资源…

推荐一款.NET开发的物联网开源项目

物联网&#xff08;IoT&#xff09;是一个正在快速发展的技术领域&#xff0c;它涉及到各种设备、物体和系统的互联。所以各种物联网平台和物联网网关项目层出不穷&#xff0c;在物联网&#xff08;IoT&#xff09;领域&#xff0c;.NET平台扮演着重要的角色。作为一款广泛使用…

管理软件供应链中网络安全工具蔓延的三种方法

软件开发组织不断发展&#xff0c;团队成长&#xff0c;项目数量增加。技术堆栈发生变化&#xff0c;技术和管理决策变得更加分散。 在这一演变过程中&#xff0c;该组织的 AppSec 工具组合也在不断增长。在动态组织中&#xff0c;这可能会导致“工具蔓延”。庞大的 AppSec 工…