[蓝桥杯]PREV-25.历届试题_城市建设
问题描述
栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修。市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他。 C市中有n个比较重要的地点,市长希望这些地点重点被考虑。现在可以修一些道路来连接其中的一些地点,每条道路可以连接其中的两个地点。另外由于C市有一条河从中穿过,也可以在其中的一些地点建设码头,所有建了码头的地点可以通过河道连接。 栋栋拿到了允许建设的道路的信息,包括每条可以建设的道路的花费,以及哪些地点可以建设码头和建设码头的花费。 市长希望栋栋给出一个方案,使得任意两个地点能只通过新修的路或者河道互达,同时花费尽量小。
输入格式
输入的第一行包含两个整数n, m,分别表示C市中重要地点的个数和可以建设的道路条数。所有地点从1到n依次编号。
接下来m行,每行三个整数a, b, c,表示可以建设一条从地点a到地点b的道路,花费为c。若c为正,表示建设是花钱的,如果c为负,则表示建设了道路后还可以赚钱(比如建设收费道路)。
接下来一行,包含n个整数w_1, w_2, …, w_n。如果w_i为正数,则表示在地点i建设码头的花费,如果w_i为-,则表示地点i无法建设码头。
输入保证至少存在一个方法使得任意两个地点能只通过新修的路或者河道互达。
输出格式
输出一行,包含一个整数,表示使得所有地点通过新修道路或者码头连接的最小花费。如果满足条件的情况下还能赚钱,那么你应该输出一个负数。
样例输入 - -
样例输出 样例说明
建设第2、、4条道路,在地点4、5建设码头,总的花费为9。
数据规模和约定
对于20%的数据,<=n<=,<=m<=,<=c<=,w_i<=;
对于50%的数据,<=n<=,<=m<=,-<=c<=,w_i<=;
对于70%的数据,<=n<=;
对于100%的数据, <= n <= , <= m <= ,-<=c<=,-<=w_i<=,w_i≠。
题目描述
代码如下:
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
#define N 200010
#define INF 0xfffffff typedef struct node
{
int x;//起点
int y;//终点
int v;//费用
}node; int n,m; //地点数,可建道路数
int f[N]; //并查集
node e[N]; int cmp(node a,node b)
{
return a.v<b.v;//按照费用从小到大排序
} int find(int x)//寻找线段根
{
return x==f[x]?x:(f[x]=find(f[x]));
} int kruskal()
{
int num,ans;
sort(e,e+m,cmp);//按照费用从小到大排序
for (int i= ; i<=n ; i++)
f[i] = i;//初始化并查集 num = ans = ;
for (int i= ; i<m ; i++)
{
int tx = find(e[i].x);//寻找x对应的树根
int ty = find(e[i].y);//寻找y对应的树根
if (tx!=ty || e[i].v<)//两地点不连接 ,或者本次建设可赚钱
{
f[tx] = ty; //更新并查集
ans += e[i].v; //更新最小边权和
num ++;
}
}
if (num < n-)//本次搜索无法并联所有地点
return INF;
return ans;
} int main(void)
{
int i,ans;
scanf("%d%d",&n,&m);
for (i= ; i<m ; i++)//遍历建设道路费用
{
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].v);
}
ans = kruskal();//得到无码头时的最小边权和
for (i= ; i<=n ; i++)//遍历建设码头费用
{
scanf("%d",&e[m].v);
if (e[m].v != -)//该地点可建设码头
{
e[m].x = ;
e[m].y = i;
m ++;
}
}
n++;
ans = min(ans,kruskal());//比较得到[ 无码头建设 ]与[ 有码头建设 ]的最小边权和
printf("%d",ans); return ;
}
C++解法
解题思路:
利用Kruskal算法,可以获得其对应的最小生成树,其边权值和即为题目对应的最小费用;
1.第一次使用Kruskal算法,对应无建设码头,生成的为只建设道路的最小费用;
2.第二次使用Kruskal算法,对应有建设码头(码头默认连接到 0 ,无对应的地点),生成的为建设道路与码头的最小费用;
(在第二次计算中,由于码头的建设,可能会出现区域独立,即一部分区域道路连接,一部分水路连接,两区域无交集,结果需抛弃)

[蓝桥杯]PREV-25.历届试题_城市建设的更多相关文章
- 蓝桥杯练习系统历届试题 剪格子 dfs
问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+|10* 1|52|+--****--+|20|30* 1|*******--+| 1| 2| 3|+--+--+--+ ...
- 蓝桥杯练习系统历届试题 带分数 dfs
问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...
- [蓝桥杯]PREV-44.历届试题_青蛙跳杯子
问题描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙 ...
- [蓝桥杯]PREV-10.历届试题_幸运数
问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的“筛法”生成 . 首先从1开始写出自然数1,,,,,,.... 就是第一个幸运数. 我们从2这个数开始.把所有序号能被2整除的项删除,变 ...
- [蓝桥杯]PREV-27.历届试题_蚂蚁感冒
问题描述 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行. 这些蚂蚁中,有1只蚂 ...
- [蓝桥杯]PREV-26.历届试题_最大子阵
问题描述 给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大. 其中,A的子矩阵指在A中行和列均连续的一块. 输入格式 输入的第一行包含两个整数n, m,分别表示矩阵A的行数和 ...
- [蓝桥杯]PREV-23.历届试题_数字游戏
问题描述 栋栋正在和同学们玩一个数字游戏. 游戏的规则是这样的:栋栋和同学们一共n个人围坐在一圈.栋栋首先说出数字1.接下来,坐在栋栋左手边的同学要说下一个数字2.再下面的一个同学要从上一个同学说的数 ...
- [蓝桥杯]PREV-22.历届试题_国王的烦恼
问题描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能存在多座桥连接.然而,由于海水冲刷,有一些大桥面临着不能使用的危险. 如果两个小岛间 ...
- [蓝桥杯]PREV-21.历届试题_回文数字
问题描述 观察数字:, 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的.这样的数字叫做:回文数字. 本题要求你找到一些5位或6位的十进制数字.满足如下要求: 该数字的各个数位之和等于输入 ...
随机推荐
- freeswitch配置功能二
<?xml version="1.0" encoding="utf-8"?><include> <context n ...
- caog
import pandas as pd#匹配可发库存1. import oslst=os.listdir(r'E:\每日必做\琪琪小象库存')lst1=[]for i in lst: if i[:2] ...
- 开始Python学习
主要结合ArcGIS进行空间数据处理 Python最讨厌的就是版本问题了 ArcGIS 10.5安装的时候已经安装了python2.7.13,但后来又安装了python3.6.1. 环境变量的设置: ...
- [LeetCode&Python] Problem 101. Symmetric Tree
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- VMware 虚拟机安装-->wrf、cmaq安装
微信关注公众号 “软件安装管家” 下载并安装VMware 下面简要记载我的安装和设置步骤: 下载解压,右键以管理员方式运行 安装好了之后 双击桌面 的VMware 输入许可证密钥:AA510-2DF1 ...
- Spring的由来以及发展
Spring简史: 第一阶段:XML配置在Spring1.x时代,都是使用XML配置Bean,随着项目扩大,我们把XML文件切分成多个配置文件,那时候需要频繁地在开发类和配置文件之间切换 第二阶 ...
- 使用JBolt新建Maven版工程步骤
一.打开新建对话框 在左侧右键new中可以找到JFinal创建工程的菜单 JBoltHome页面也有快捷按钮用来弹出创建工程对话框. 二.填写Maven和其他信息配置 填写工程name 主包名 下面有 ...
- redis(4.0.11)编译安装
一: redis数据库安装 系统环境:linux系统(centos/redhat):Red Hat Enterprise Linux Server release 6.8 (Santiago) red ...
- 第3章 Data语意学
在C++中经常会遇到一个类的大小问题,关于一个类的大小一般受到三个方面的影响. 语言本身所造成的额外负担,如在虚拟继承中会遇到如派生类中会包含一个指针指向base class subobjec,这样会 ...
- 在树莓派2或3的kali上 RCA(a/v connector)接口的正确使用方法(多图)(原创)
AV接口又称(RCA),AV接口算是出现比较早的一种接口,它由黄.白.红三种颜色的线组成,其中黄线为视频,红色为左声道,白色为右声道. ...