还是畅通工程(思想+代码)

Description

某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。

Input

测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。

Output

对每个测试用例,在1行里输出最小的公路总长度。

Sample Input

3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0

Sample Output

3

5

解题思路:

典型的最小生成树的问题,利用krusal算法代码简洁效率高。

但是在构建图的时候尽量不要用邻接矩阵,因为邻接矩阵既浪费空间有耗时间,采用邻接表更好

正解:

#include<cstdio>
#include<algorithm>
typedef struct
{int from;int to;int value;
}Node,*node;
int Find(int *father,int x)
{if(x!=father[x])father[x]=Find(father,father[x]);return father[x];
}
void Union(int *father,int from,int to)
{int a=Find(father,from);int b=Find(father,to);father[a]=b;
}
bool cmp(const Node & a,const Node & b)
{return a.value<b.value;//从小到大排序
}
using namespace std;
int main()
{int N,i=0;while(~scanf("%d",&N),N){Node mp[N*N+1];int father[N+1];for(i=0;i<=N;i++)father[i]=i;for(i=0;i<N*(N-1)/2 ;i++)scanf("%d%d%d",&mp[i].from,&mp[i].to,&mp[i].value);sort(mp,mp+N*(N-1)/2,cmp);int sum=0;for(i=0;i<N*(N-1)/2;i++){if(Find(father,mp[i].from)!=Find(father,mp[i].to)){Union(father,mp[i].from,mp[i].to);sum+=mp[i].value;}//printf("%d %d %d\n",mp[i].from,mp[i].to,mp[i].value);}printf("%d\n",sum);}return 0;
}
开始写时的错误代码:

因为”动态“数组的边界数开的范围不正确

#include<algorithm>//Runtime Error(ACCESS_VIOLATION)
#include<cstdio>
int Find(int * helper,int a)//传递了数组的地址 
{
if(a!=helper[a])
helper[a]=Find(helper,helper[a]);
return helper[a];
}//并查集FIND 
void Union(int * helper,int a,int b)//传递了数组的地址 
{
int x=Find(helper,a);//找a的父节点 
int y=Find(helper,b);//b的父节点 
helper[y]=x;//合并 
}//并查集UNION 
typedef struct M
{
int a;
int b;
int v;
}Node;//存储图的边(u,v)以及对应的值 
bool cmp(const Node & x,const Node & y)
{
return x.v<y.v;
}//sort排序,对值进行降序排序 
using namespace std;
int main(void)
{
int N;
while(scanf("%d",&N)!=EOF&&N)
{
Node vex[N];//存储(u,v)关系(错误) 
int helper[N+1];//新建并查集 
for(int i=0;i<N+1;i++)
helper[i]=i;//并查集初始化 
int T=0;
while(T!=N*(N-1)/2)
scanf("%d%d%d",&vex[T].a,&vex[T].b,&vex[T++].v);
sort(vex,vex+N,cmp);
int sum=0;
for(int i=0;i<N;i++)//K...算法 
{
if(Find(helper,vex[i].a)!=Find(helper,vex[i].b))
{
Union(helper,vex[i].a,vex[i].b);
sum+=vex[i].v;//记录树的总值 

}
printf("%d\n",sum);
}
return 0;
}

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

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

相关文章

构建数据中台的组织架构

一、中台是一种企业架构 1.TOGAF企业架构标准 TOGAF是一套企业架构标准。企业架构是指整个公司或企业的软件和其他技术的整体观点和方法。企业架构又细分为业务架构、应用架构、数据架构、技术架构几个方向。 其中业务架构的定义是“定义业务战略和组织&#xff0c;关键业务…

源于加速,不止加速——10年沉淀,破局改变

20余年技术&#xff0c;面临破局。CDN(Content Delivery Network&#xff0c;内容分发网络) 是一个超大规模的分布式系统&#xff0c;为互联网各类App和Web站点提供动 / 静态内容、实时流媒体加速以及网络安全防护等能力。在线购物、直播、音乐、游戏、社交等等一切&#xff0c…

C++注释符问题

#include<iostream>using namespace std;int main(){std::cout<<"/*";std::cout<<"*/";std::cout<</*"*/"*/;std::cout<</*"*/"/*"/*"*/;return 0;} 运行出错&#xff0c;第二行无法识别[Wa…

5分钟让你在大火的多模态领域权威榜单VQA上超越人类

ModelScope上开源了达摩院众多业界最强多模态模型&#xff0c;其中就有首超人类的多模态预训练视觉问答模型mPLUG&#xff0c;小编激动的搓搓小手&#xff0c;迫不及待的体验了一下。 一探&#xff1a;浅草才能没马蹄 市面上有好多号称“用户上手简单”&#xff0c;“一步到位…

表达式类型出错

#include<iostream>using namespace std;int main(){int a-1;unsigned b1;cout<<a*b<<endl;return 0;} 编译结果为一个随机数&#xff0c;因为a&#xff0c;b分别为带符号类型和无符号型整数。

私有化输出的服务网格我们是这样做的

介绍 微服务开发的问题 微服务架构下我们在开发中遇到的常见的问题有以下 4 个&#xff1a; 多语言问题&#xff1a;有多种编程语言&#xff0c;node.js, JAVA, GoLang…微服务需要为每种语言都维护一种中间件 SDK升级推动难&#xff1a;SDK 升级需要推动业务应用进行代码修…

技术解读:Dragonfly 基于 P2P 的智能镜像加速系统

背景 网络下载 提起网络下载领域&#xff0c;你应该首先会想到基于 TCP/IP 协议簇的 C/S 模式。这种模式希望每一个客户机都与服务器建立 TCP 连接&#xff0c;服务器轮询监听 TCP 连接并依次响应&#xff0c;如下图&#xff1a; 上世纪末期&#xff0c;基于 C/S 模式的思想&…

多行书写的字符串字面值

#include<iostream>using namespace std;int main(){cout<<"Hello Word!""Best Coder!"<<endl;return 0;}

c++中值得初始化

代码中四种初始化&#xff0c;a中都为0 #include<iostream> using namespace std;int main(){int a0;cout<<a<<endl;int a1{0};cout<<a1<<endl;int a2{0};cout<<a2<<endl;int a3(0);cout<<a3<<endl;return 0;}

Kruise Rollout:灵活可插拔的渐进式发布框架

前言 Kruise Rollout 是 OpenKruise 社区开源的渐进式交付框架。Kruise Rollout 支持配合流量和实例灰度的金丝雀发布、蓝绿发布、A/B Testing 发布&#xff0c;以及发布过程能够基于 Prometheus Metrics 指标自动化分批与暂停&#xff0c;并提供旁路的无感对接、兼容已有的多…

最小生成树的Prime算法的思想

Prime算法的核心步骤是&#xff1a;在带权连通图中V是包含所有顶点的集合&#xff0c; U已经在最小生成树中的节点&#xff0c;从图中任意某一顶点v开始&#xff0c;此时集合U{v}&#xff0c;重复执行下述操作&#xff1a;在所有u∈U,w∈V-U的边(u,w)∈E中找到一条权值最小的边…

c++引用“”

常见的是“左值引用”在c11中新增了“右值引用” 引用&#xff1a;为对象起另外一个名字&#xff0c;引用类型引用另外一种类型。通过声明符写成&d的形式来定义引用类型&#xff0c;其中d是引用类型名。 例如&#xff1a; int a1024; int &ba;//那么b就等于a的值了…

一线技术人应该关注的四种思维能力

引言 作为长期奋战在一线的技术人&#xff0c;我深刻体会到如下几个思维能力对技术人成长的重要性&#xff0c;熟练运用这几种思维可以帮助我们快速的进入到新的领域&#xff0c;在分析、定位和解决问题上有很大帮助。 抽象思维&#xff1a;帮助我们快速抽取面对问题的关键要素…

Nacos 企业版如何提升读写性能和可观测性

概述 微服务引擎 MSE 发布 2.0.4.0 版本&#xff0c;新版本主要在性能和可观测能力升大幅提升&#xff0c;也加固了安全性。性能方面&#xff0c;基于 Dragonwell 进行构建&#xff0c;服务发现和配置性能提升达 40%以上&#xff1b;可观测方面&#xff0c;提供了服务注册的轨…

「技术人生」第9篇:如何设定业务目标

写在前面 上一篇文章讲了如何构建业务大图&#xff0c;看到有评论说这和设定 OKR 差不多啊。希望其他读者不要被类似的看法带偏。业务大图是业务顶层设计&#xff0c;是战略目标、业务长期价值、业务维度拆分、业务组织设计、业务长期发展方向、关键业务战役、短期重点事项的综…

SPFA总结

动态逼近法&#xff1a;设立一个先进先出的队列用来保存待优化的结点&#xff0c;优化时每次取出队首结点u&#xff0c;并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作&#xff0c;如果v点的最短路径估计值有所调整&#xff0c;且v点不在当前的队列中&#…

我们总结了 3 大使用建议,并首次公开 Nacos3.0 规划图

Nacos 是什么 Nacos 是 Dynamic Naming and Configuration-Service 的首字母简称&#xff0c;定位于一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。从 2018 年 7 月开始宣布开源以来&#xff0c;已经走过了第四个年头&#xff0c;在这四年里&#xff0c;备…

容斥原理 和 欧拉函数

在概率论中&#xff0c;对于概率空间中的事件A1&#xff0c;……&#xff0c;An&#xff0c;当n 2时容斥原理的公式为&#xff1a; 当n 3时&#xff0c;公式为&#xff1a; 一般地&#xff1a; 正数n的唯一素因子分解式p1^a1 * p2^a2 * p3^a3 ……* pk^ak 。求1&#xff0c;2…

递归函数时间复杂度分析

递归函数时间复杂度分析 (1) 递归执行过程 例子&#xff1a;求N!。 这是一个简单的"累乘"问题&#xff0c;用递归算法也能解决。 n! n * (n - 1)! n > 1 0! 1, 1! 1 n 0,1 因此&#xff0c;递归算法如下&#xff1a; Jav…

Dubbo 3 StateRouter:下一代微服务高效流量路由

目前的微服务架构中&#xff0c;通常包含服务消费者、服务提供者、注册中心、服务治理四元素&#xff0c;其中服务消费者会向注册中心获取服务提供者的地址列表&#xff0c;并根据路由策略选出需要调用的目标服务提供者地址列表&#xff0c;最后根据负载算法直接调用提供者。当…