CCF CSP 地铁修建 最小生成树+并查集

CCF CSP 201703-4 地铁修建(最小生成树+并查集) 说起来今天一天基本没干别的,净窝在床上学习最小生成树和并查集了,而且就做了这么一题… 前几天考了csp,居然只对了第一题,第二题0分!真的要自闭了!然后第四题叫数据中心,当时就觉得可能是求最小生成树中的最大边,然而…我当时不会具体的代码实现,菜哭! 事实证明,我的猜想完全正确,而我的室友这题得了满分,这突如其来的心酸是肿么肥四… 好了,言归正传,这题地铁修建和那题的解法差不多,甚至要更难,因为那题... 阅读详情
A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁。
  地铁由很多段隧道组成,每段隧道连接两个交通枢纽。经过勘探,有m段隧道作为候选,两个交通枢纽之间最多只有一条候选的隧道,没有隧道两端连接着同一个交通枢纽。
  现在有n家隧道施工的公司,每段候选的隧道只能由一个公司施工,每家公司施工需要的天数一致。而每家公司最多只能修建一条候选隧道。所有公司同时开始施工。
  作为项目负责人,你获得了候选隧道的信息,现在你可以按自己的想法选择一部分隧道进行施工,请问修建整条地铁最少需要多少天。
输入格式
  输入的第一行包含两个整数n, m,用一个空格分隔,分别表示交通枢纽的数量和候选隧道的数量。
  第2行到第m+1行,每行包含三个整数a, b, c,表示枢纽a和枢纽b之间可以修建一条隧道,需要的时间为c天。
输出格式
  输出一个整数,修建整条地铁线路最少需要的天数。
样例输入
6 6
1 2 4
2 3 4
3 6 7
1 4 2
4 5 5
5 6 6
样例输出
6
样例说明
  可以修建的线路有两种。
  第一种经过的枢纽依次为1, 2, 3, 6,所需要的时间分别是4, 4, 7,则整条地铁线需要7天修完;
  第二种经过的枢纽依次为1, 4, 5, 6,所需要的时间分别是2, 5, 6,则整条地铁线需要6天修完。
  第二种方案所用的天数更少。
评测用例规模与约定
  对于20%的评测用例,1 ≤ n ≤ 10,1 ≤ m ≤ 20;
  对于40%的评测用例,1 ≤ n ≤ 100,1 ≤ m ≤ 1000;
  对于60%的评测用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 10000,1 ≤ c ≤ 1000;
  对于80%的评测用例,1 ≤ n ≤ 10000,1 ≤ m ≤ 100000;
  对于100%的评测用例,1 ≤ n ≤ 100000,1 ≤ m ≤ 200000,1 ≤ a, b ≤ n,1 ≤ c ≤ 1000000。

  所有评测用例保证在所有候选隧道都修通时1号枢纽可以通过隧道到达其他所有枢纽。

————————————————————————————————————————————————————
    这题题意就是要找从起点到终点的一条路线,并且在组成这条路线中的最长路径比起其他线路中最长的是最小的。
    这题就是用最小生成树的方法解决就行了。因为目的是要找边。所以用Kruskal算法,先把边集按从小到大的顺利排序,之后每次加入还未使用过的且不会形成回路的最短边,一直添加到起点和终点连通后,最后添加的边的大小就是答案。
    要判断添加一条边后是否会构成回路,以及是否终点与定点连通了,我们可以使用并查集高效的处理。find(int x)函数是用于找到节点x的祖先,union_p(intx,int y)用于合并两颗以x和y作为根节点的树。初始时每个节点都是根节点,它们的祖先也就是自己。find(int x)函数不仅能返回每个节点的根节点,还能把每个节点都变成根节点的子节点,这样下次再查找这棵树的根节点时能够很快查找到。连个节点是连通的,那么它们的根节点一定是同一个节点,由此我们可以判断连通性。
    代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define maxx 100010
struct node{
	int x,y,z;
}n1;
int p[maxx];
int n,m;
vector<struct node>vec;
bool cmp(struct node n2,struct node n3)
{
	return n2.z < n3.z; 
}
int find(int x)
{
	if(p[x] == x)
	{
		return x;
	}else{
		int y=find(p[x]);
		p[x] = y; 
		return y;
	}
}
void union_p(int x,int y)
{
	if(x==y)
	{
		return ;
	}
	p[x] = y;
}
int main()
{
	int x,y,z;
	cin >> n >> m;
	for(int i=0;i<m;i++)
	{
		cin >> x >> y >> z;
		n1.x=x,n1.y=y,n1.z=z;
		vec.push_back(n1);
	}
	sort(vec.begin(),vec.end(),cmp);
	for(int i=1;i<=n;i++)
	{
		p[i]=i;
	}
	int i=0;
	while(i<m)
	{
		x=vec[i].x,y=vec[i].y,z=vec[i].z;
		int xf = find(x);
		int yf = find(y);
		union_p(xf,yf);
		if(find(1)==find(n))
		{
			break;
		} 
		i++;
	}
	cout << z << endl;
	return 0;
}


CSP 201703-4 地铁修建【最小生成树+并查集】 问题描述 试题编号: 201703-4 试题名称: 地铁修建 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁。   地铁由很多段隧道组成,每段隧道连接两个交通 阅读详情

相关推荐

历年CCF-CSP认证考试题目解法/思想

每年的题难度都不太一样,这一点在16、17年上尤其明显,难度低的时候前两道题就是送分题,加一起15分钟解决,得分样例水的不行。难度高的时候第二题就让你模拟半天,且测试样例诡异无比,测试样例通过可能只=20分,就别说后面3,4题了。 总结一些技术点、难点: 字符串处理上:lcs(最长公共子序列),kmp(字符串匹配算法),复杂题设计思维+注释,类的设置,数据封装,多重嵌套解法

董公子的博客 2万+

CCF CSP 201812-4数据中心【二分答案】【最小生成树】

问题分析 抛开特别长的题干,我们提取关键信息,发现:是一个无向图,边权,求最优树结构。 最小化传输时间Tmax Tmax=max{Th} Th=max{th,i} Tmax=max{thi} 1≤h ≤dep,1 ≤i ≤size(h) Tmax=max{T1,T2,T3} =max{t1,1,t1,2,t1,3,t2,1,t2,2,t2,3, ,t3,1} =max{树上边权} 问题转...

YingMila的博客 310

ccf-csp之地铁修建(最小堆dijkstra算法)

最小堆dijkstra算法解ccf-csp的地铁修建问题

yulijuanxmu的博客 1856

CSP 201812-4 数据中心 最小生成树 Kruskal模板

马上九月份就要参加我的第一次CSP认证考试了,最近几天都是在刷往年真题和看书,把俱乐部半年学到的东西基本都复习了一遍,也有很多新的收获。最近也是看了很多他人写的博客,很有心得。 一位大佬在题为“CSP认证从180分到380分的感想”的文章中写道,“CSP上拿一个将近400分甚至高于400分的分数或者PAT上拿一个90+的分数,是不需要什么编程天赋的,任何一个普通人只要付出足够的努力都是可以做到的。它和数学差不多,都需要大量重复的不厌其烦的练习练习再练习,没有什么捷径,只要肯付出沉下心来去做,一两个月的时间我

weixin_46283740的博客 403

CCF CSP认证201703-4 地铁修建(Kruskal最小生成树)

201703-4 地铁修建 题目 思路 这次的第四题比较简单,就是一个Kruskal最小生成树算法,我还一度担心“公司数为n”这块有个坑。 题目的要求是,找一条1至n的路径,使这条路径上的最大边在所有1至n路径最大边中最小。因为有n个公司,而1至n的无环路径边数肯定是小于n的,所以不用考虑一个公司修两条路的情况。 Kruskal算法可用并查集实现,将所有边按权排序,从小的开始枚举,如果边的两端不...

weixin_43944910的博客 433

解决rt-thread上使用SPI+DMA

首先阐述下遇到的问题 使用SPI读取icm20602数据,读取频率为1000hz,使用stm32f407主控,发现CPU占用率达到了70%,将此线程注释掉后CPU占用率掉到25%,看来这里要着重优化,便萌生了使用DMA的想法。 使用SPI+DMA要进行的配置 1.开启RTT设备驱动。点击自己的工程 ->RT-Thread Setting2.在board.hzhong3.在board.c文件里加入以下函数,此函数受设备框架调用 void HAL_SPI_MspInit(SPI_HandleTypeDef

响望的博客 8085

最小生成树问题二(csp 201812-4 数据中心)

解题思路: 很容易看出这是求最优生成树的问题,这里最优的条件是Tmax最小,而Tmax=max(Th),而Th=max(t h,j),不难推出两层max的作用使得Tmax就是整棵树的最长边,所以等价于求最长边最小的生成树的问题。要使得最大值最小,可以二分答案,也可以利用最小生成树的性质。最小生成树一定满足整棵树的最长边最短,反之不然,故我们只需要求出最小生成树即可,依然用并查集实现的Kruska...

Tony Yang的博客 272

前端埋点的实践

1、前言 开始正文前先介绍一下埋点的概念~,(熟悉的朋友可以略过) 前端埋点: 是一种手段,它的目的是上报相关行为数据,相关人员以数据为依据来分析产品在用户端的使用情况,根据分析出来的结果辅助产品优化、迭代。 BI:商业智能,公司内部做数据分析相关的部门。 2、背景 在流量红利逐渐消失的现在,数据的采集、分析和精细化的运营显得更加重要,所以埋点的需求在互联网产品中是很常见的,目的上面也提到了。我们的追求就是又快又好的做好埋点工作,但是现实却不那么美好;目前我们团队在前端埋点方面存在一些痛点: 在构造埋点字段

Arui_0的博客 1772

CCF-CSP 201812-4 数据中心 最小生成树

CCF

想买很多漂亮衣服但是买不起的博客 201

51单片机学习(5)-----蜂鸣器的介绍与使用

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计 算机、 打印机、 复印机、 报警器、 电子玩具、 汽车电子设备、 电话机、 定 时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。1.半导体三极管也称为晶体三极管,可以说它是电子电路中最重要的器件。三极管顾名思义具有三个电极。二极管是由一个PN结构成的,而三极管由两个PN结构成,共用的一个电极成为三极管的基极(用字母b表示)。其他的两个电极成为集电极(用字母c表示)和发射极(用字母e表示)。

2302_80260350的博客 1万+

python代码爬取大众点评评论!直接copy就可以运行!

python代码爬取大众点评评论!直接copy就可以运行!

QiuQiRuQin的博客 1万+

[week6](CSP201812-4)数据中心——最小生成树

目录题意InputOutput输入样例输出样例提示分析总结代码 题意 Input Output 输入样例 4 5 1 1 2 3 1 3 4 1 4 5 2 3 8 3 4 2 输出样例 4 提示 分析 这道题需要利用Kruskal算法和二分法得到答案。 ????Kruskal算法????[week6]掌握魔法の东东 I —— 最小成本生成树(Kruskal) 题目分析 说实话我这道题读了几遍...

明哲天翊的博客 575

OpenClaw 超级 AI 实战专栏【模型推理与实战】(二)官方预训练模型下载与使用

OpenClaw 预训练模型需按「固定目录结构」存放(模型文件夹包含权重 + 配置文件),否则会加载失败;核心流程:下载模型→验证文件完整性→加载模型→传入图片执行推理→可视化结果;常见问题集中在「路径错误」「显存不足」「文件缺失」,按文中方案可快速解决。

qq_36130719的博客 307

CSP 201703-4 地铁修建 python 最小生成树,并查集

由于所有的隧道同时开始修建,则当需要花费时间最长的隧道的时间值最小时,即为修建整条地铁线路最少的时间。采用最小生成树思想,运用Kruskal算法即可求解。采用并查集思想,当第一个点和最后一个点在同一个集合时,表明此时隧道已经修建 完毕,输出最后完成的隧道所需天数即可。

风信子的猫Redamancy的快乐星球 2111

【零基础入门unity游戏开发——2D篇】大大简化了地形创建流程,减少Rule Tile的使用 —— AutoTile自动平铺瓦片的使用介绍

Unity 2D游戏开发中的AutoTile技术详解 摘要:本文详细介绍了Unity 2D游戏开发中的AutoTile技术,这是一种智能瓦片系统,能够自动处理地形和场景拼接。文章首先讲解了AutoTile的基本概念和优势,然后分步骤指导读者如何安装2D Tilemap Extras包、创建AutoTile、设置参数和绘制遮罩。通过实际案例演示了AutoTile的使用方法,并比较了AutoTile与Rule Tile的适用场景。最后指出AutoTile虽然使用方便,但对素材要求较高,开发者应根据项目需求选择合

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 729

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

CCF-CSP 201703-4地铁修建 并查集+Kruskal算法 满分题解

CCF-CSP 201703-4地铁修建 并查集+Kruskal算法 满分题解 题目链接:201703-4地铁修建 思路: 1. 由于所有的隧道同时开始修建,则当需要花费时间最长的隧道的时间值最小时,即为修建整条地铁线路最少的时间。 2. 采用最小生成树思想,运用Kruskal算法即可求解。 3. 采用并查集思想,当第一个点和最后一个点在同一个集合时,表明此时隧道已经修建 完毕,输出最后完成的隧道所需天数即可。 具体代码: #include <iostream> #include <alg

只须一笑不须愁X的博客 1296

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

CCF CSP 地铁修建

CCF CSP 地铁修建

DylanJoe的博客 757

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

CCP-CSP认证考试 201703-4 地铁修建 c/c++题解

CCF-CSP认证考试题解目录By东瓜lqd 题目描述: 试题编号: 201703-4 试题名称: 地铁修建 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁。   地铁由很多段隧道组成,每段隧道连接两个交通枢纽。经过勘探,有m段隧道作为候选,两个交通枢纽之间最多只有...

东瓜blog 838

ccf csp 201703-4 地铁修建 c++最小生成树

第一次的错误:freopen忘记注释 第二次第三次都没有想到最关键的错误点上: Tree和findroot不是对等的!!!!!! 所以很悲催。 这个题目其实就是一个最小生成树问题求解,不过不需要求出所有的子节点。只要1和n连通就行。即findroot(n)==1即可。下面上代码。 问题描述   A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽...

二十四桥明月夜的博客 600

CCF:201703-4 地铁修建

试题编号: 201703-4 试题名称: 地铁修建 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁。   地铁由很多段隧道组成,每段隧道连接两个交通枢纽。经过勘探,有m段隧道作为候选,两个交通枢纽之间最...

nanke_4869的博客 343

CCF 201703-4 地铁修建

问题描述   A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁。   地铁由很多段隧道组成,每段隧道连接两个交通枢纽。经过勘探,有m段隧道作为候选,两个交通枢纽之间最多只有一条候选的隧道,没有隧道两端连接着同一个交通枢纽。   现在有n家隧道施工的公司,每段候选的隧道只能由一个公司施工,每家公司施工需要的天数一致。而每家公司最多只能修建一条候选...

烤上地瓜 218

地铁修建(csp201703-4)(kruskal || Dijkstra)

文章目录问题描述InputOutputSample inputSample output样例说明数据范围解题思路题意思路kruskal做法完整代码-kruskaldijkstra做法完整代码 问题描述 \hspace{17pt}A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁。   地铁由很多段隧道组成,每段隧道连接两个交通枢纽。经过勘探,有m段...

龙征天的博客 713

CCF CSP 2017年3月第4题 地铁修建(Kruskal算法)

问题描述 试题编号: 201703-4 试题名称: 地铁修建 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁。   地铁由很多段隧道组成,每段隧道连接两个交通

nudt_oys的博客 1800
上一篇: poj-2948
下一篇: 信息检索P@10、MAP、NDCG,及同一指标计算的差别
more_ugly_less_bug
博客等级 码龄10年 28粉丝 39原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值