村村通工程(Kruskal算法)/最小生成树Kruskal算法【数据结构】

村村通工程(Kruskal算法)

题目描述

"村村通"是国家一个系统工程,其包涵有:公路、电力、生活和饮用水、电话网、有线电视网、互联网等等。

村村通公路工程,是国家为构建和谐社会,支持新农村建设的一项重大举措,是一项民心工程。又称“五年千亿元”工程

该工程是指中国力争在5年时间实现所有村庄通沥青路或水泥路,以打破农村经济发展的交通瓶颈,解决9亿农民的出行难题。

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

要求用Kruskal算法求解

输入

第1行:顶点数n

第2行:n个顶点编号

第3行:边数m

接着m行:m条边信息,格式为:顶点1 顶点2 权值

输出

第1行:输出最小生成树的权值之和

接着n-1行对应n-1条边信息

如果能找到最小生成树,按树的生长顺序输出, 边顶点按数组序号升序输出

如果输入数据不足以保证畅通,则直接输出−1,无需输出任何边信息

输入样例1
6
v1 v2 v3 v4 v5 v6
10
v1 v2 6
v1 v3 1
v1 v4 5
v2 v3 5
v2 v5 3
v3 v4 5
v3 v5 6
v3 v6 4
v4 v6 2
v5 v6 6

输出样例1
15
v1 v3 1
v4 v6 2
v2 v5 3
v3 v6 4
v2 v3 5

最小生成树Kruskal算法

思路:图中每个顶点各自构成一个连通分量,然后按照边的权值由小到大的顺序.依次考察边集E中的各条边。

若被考察边的两个顶点属于两个不同的连通分量则将此边加人到TE中,同时把两个连通分量连接为一个连通分量;若被考察边的两个顶点属于同一个连通分量,则舍去此边,以免造成回路,如此下去,当T中的连通分量个数为1时,此连通分量便为G的一棵最小生成树。

#include<bits/stdc++.h>
using namespace std;
struct line
{//记录边连接的两个点 且s1的下标比s2的下标小string s1,s2;//记录边的长度int path;
}lines[205];
//将边按照权值从小到大排序
bool cmp(line l1,line l2)
{return l1.path<l2.path;
}
//判断两个点是否不在同一个连通分量
bool judge(int home[],int index,map<string,int> m)
{string s1=lines[index].s1;string s2=lines[index].s2;int a1=m[s1];int a2=m[s2];if(home[a1]==home[a2]) return 0;else return 1;
}
//更新home值
void changeHome(int home[],int ini,int fin,int n)
{for(int i=0;i<n;i++){if(home[i]==ini) home[i]=fin;}
}
int main()
{int n;cin>>n;//记录节点string s[205];//记录节点的下标map<string,int> m;for(int i=0;i<n;i++) {cin>>s[i];m[s[i]]=i;}int line;cin>>line;for(int i=0;i<line;i++){string s1,s2;int k;cin>>s1>>s2>>k;if(m[s1]<m[s2]){lines[i].s1=s1;lines[i].s2=s2;}else{lines[i].s1=s2;lines[i].s2=s1;}lines[i].path=k;}//将边按照权值从小到大排序sort(lines,lines+line,cmp);//记录所在连通分量 用该连通分量内最小的下标表示int home[205];for(int i=0;i<n;i++) home[i]=i;int index=0;int i;int res=0;string ans="";for(i=0;i<n-1;i++){//judge判断两个点是否不在同一个连通分量while(index<line&&!judge(home,index,m)) index++;if(index==line) break;int a1=m[lines[index].s1];int a2=m[lines[index].s2];if(home[a1]>home[a2]) swap(a1,a2);//更新home值changeHome(home,home[a2],home[a1],n);res+=lines[index].path;ans=ans+lines[index].s1+" "+lines[index].s2+" "+to_string(lines[index].path)+"\n";index++;}if(i<n-1) cout<<"-1"<<endl;else{cout<<res<<endl;cout<<ans;}return 0;
}

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

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

相关文章

【Shell】Shell基础学习

一、shell脚本 (1)第一个shell脚本 #!/bin/bash #this is a comment echo "hello world"一个shell脚本永远以“#!”开头,这是一个脚本开始的标记,它是告诉系统执行这个文件需要用某个解释器,后面的/bin/bash就是指明解释器的具体位置。 “#”开头是注释 …

P8A003-系统加固-系统管理员账户安全

【预备知识】 Administrator 原意为管理人或行政官员或遗产管理人&#xff0c;在计算机名词中&#xff0c;它的意思是系统超级管理员或超级用户。但是在Windows系统中此用户名只在安全模式中使用。 【实验步骤】 网络拓扑&#xff1a;server2008-basic windows server 2008 …

LeetCode [简单]118. 杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 public class Solution {public IList<IList<int>> Generate(int numRows) {List<IList<int>> res new …

交流负载测试使用场景

交流负载测试是一种在特定环境下&#xff0c;对电力设备、汽车电子部件&#xff0c;工业自动化设备、网络设备、家电产品&#xff0c;航空航天设备以及医疗器械等产品进行测试的方法&#xff0c;该测试的目的是评估这些设备在实际运行条件下的性能和可靠性。 1电力设备测试 交…

Zabbix 6.0 详细基础介绍

目录 一、如何选择自己的运维监控平台 1.1 常用的开源运维监控工具 1.1.1 Cacti 1.1.2 Nagios 1.1.3 Ganglia 1.1.4 Centreon 1.1.5 Grafana 1.1.6 Prometheus 1.1.7 Zabbix 1.2 监控工具选型经验 1.2.1 中小企业传统监控选择 Zabbix 1.2.2 云原生监控选择 Prometh…

虚幻学习笔记2—点击场景3D物体的两种处理方式

一、前言 本文使用的虚幻引擎为5.3.2&#xff0c;两种方式分别为&#xff1a;点击根物体和精准点击目标物体。 二、实现 2.1、玩家控制器中勾选鼠标点击事件&#xff1a;这一步很重要&#xff0c;如图2.1.1所示&#xff1a;在自定义玩家控制器中勾 图2.1.1 选该项&#xff0c…

GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF

GPT实战系列-GPT训练的Pretraining&#xff0c;SFT&#xff0c;Reward Modeling&#xff0c;RLHF 文章目录 GPT实战系列-GPT训练的Pretraining&#xff0c;SFT&#xff0c;Reward Modeling&#xff0c;RLHFPretraining 预训练阶段Supervised FineTuning &#xff08;SFT&#x…

Vue 3 面试经验分享

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

docker容器运维操作命令

docker exec &#xff1a;在运行的容器中执行命令 docker exec [OPTIONS] CONTAINER COMMAND [ARG...] OPTIONS说明&#xff1a; -d :分离模式: 在后台运行 -i :即使没有附加也保持STDIN 打开 -t :分配一个伪终端docker ps : 列出容器 docker ps [OPTIONS] OPTIONS说明&#…

【EI会议投稿】第四届物联网与智慧城市国际学术会议(IoTSC 2024)

第四届物联网与智慧城市国际学术会议 2024 4th International Conference on Internet of Things and Smart City 继IoTSC前三届的成功举办&#xff0c;第四届物联网与智慧城市国际学术会议&#xff08;IoTSC 2024&#xff09;将于2024年3月22-24日在河南洛阳举办。 智慧城市的…

<HarmonyOS第一课>应用程序框架 【课后考核】

【习题】应用程序框架 判断题 一个应用只能有一个UIAbility。错误(False)创建的Empty Ability模板工程&#xff0c;初始会生成一个UIAbility文件。正确(True)每调用一次router.pushUrl()方法&#xff0c;页面路由栈数量均会加1。错误(False) 单选题 API9及以上&#xff0c;r…

Oracle ORA12514 监听程序当前无法识别连接描述符中请求的服务

最简单的有可能是你的服务还没有开启&#xff0c;需要启动服务&#xff01;&#xff01;&#xff01;&#xff01; 在连接数据库的时候&#xff0c;有时会遇到一个“ORA12514&#xff1a;监听程序当前无法识别连接描述符中请求的服务”的错误&#xff0c;这个错误其实就是数据…

二十章多线程

概念 有很多工作是可以同时完成的&#xff0c;这种思想放在Java中被称为并发&#xff0c;并发完成每一件事被称为线程。 程序员可以在程序中执行多个线程&#xff0c;每一个线程完成一个功能//与其他线程并发执行&#xff0c;这种机制被称为多线程&#xff0c;并不算所有编程…

Echarts大屏可视化_02 球体模块制作

继续跟着b站大佬pink老师学大屏可视化 球体模块制作 1.球体模块布局 HTML <div class"column"><div class"no"><div class"no-hd"><ul><li>125811</li><li>104563</li></ul></div&g…

Mysql解决随机选取问题

常规的随机选取效率差的原因&#xff1a; 两种解决方法&#xff1a; 总结&#xff1a;

如何在nginx中进行路径的重写并进行转发到指定服务器

在我们的前后端开发过程中&#xff0c;如果前端页面在请求后台服务器的时候&#xff0c;在url中都会存在/api这个请求前缀&#xff0c;但是我们的后台服务接口中却没有/api的路径&#xff0c;那么在不修改服务端代码的情况下&#xff0c;我们可以通过nginx来轻松解决这个问题。…

基于单片机设计的超声波测距仪(采用HC-SR04模块)

一、前言 本项目是基于单片机设计的超声波测距仪&#xff0c;主要采用了STC89C52单片机和HC-SR04超声波测距模块。通过LCD1602液晶显示屏来展示测量的距离信息。 超声波测距技术是一种常见的非接触式测距方法&#xff0c;利用超声波的传播速度测量物体与测距器之间的距离。它…

Phpstudy v8.0/8.1添加 php-7.4.9

1、官网下载最新的php版本 打开Windows版的官网下载&#xff0c;地址&#xff1a;PHP For Windows: Binaries and sources Releases 页面上有不同的PHP版本&#xff0c;这里我们下载的是64位nts版的PHP7.4.9&#xff0c;php-7.4.9-nts-Win32-vc15-x64.zip。 2、解压下载的文…

前缀和算法总结

前缀和思维导图&#xff1a; 一维前缀和算法模版&#xff1a; #include <iostream>using namespace std;const int N 100010;int n, m; int s[N];int main() {scanf("%d%d", &n, &m);for (int i 1; i < n; i){int x;scanf("%d", &…

java后端实现登录退出功能,并用过滤器验证

java后端实现登录功能&#xff0c;并用过滤器验证 登录&#xff0c;退出功能 登录&#xff0c;退出功能的逻辑思路&#xff1a;* 1. 密码md5加密* 2. 根据用户名查询数据库* 3. 比对密码* 4. 查看状态* 5. 将员工的id存放到session代码实现Slf4j //输出日志方便调试 RestCon…