当前位置: 首页 > news >正文

【蓝桥杯 2024 省 Python B】缴纳过路费

【蓝桥杯 2024 省 Python B】缴纳过路费


蓝桥杯专栏:2024 省 Python B
算法竞赛:图论,生成树,并查集,组合计数,kruskal 最小生成树,乘法原理
题目链接:洛谷 【蓝桥杯 2024 省 Python B】缴纳过路费

题目描述:
在繁华的商业王国中,NNN 座城市被 MMM 条商路巧妙地连接在一起,形成了一个错综复杂的无向图网络。每条商路是双向通行的,并且任意两座城市之间最多只有一条直接的商路。每条商路都有它的规则,其中最引人注目的就是穿过
商路,需要缴纳过路费。因此,商人们在选择商路时必须格外认真。
有一位名叫小蓝的商人,他对于商路的花费有着自己独到的见解。在小蓝眼中,一条路线包含一条或多条商路,但路线的成本并不是沿途累积的过路费总和,而是这条路线上最贵的那一次收费。这个标准简单而直接,让他能迅速评估出一条路线是否划算。
于是,他设立了一个目标,即找出所有城市对,这些城市之间的最低路线成本介于他心中预设的两个数 LLLRRR 之间。他相信,这样的路线既不会太廉价,以至于路况糟糕;也不会过于昂贵,伤害他精打细算的荷包。
作为小蓝的助手,请你帮助小蓝统计出所有满足条件的城市对数量。

输入格式:
输入的第一行包含四个整数 N,M,L,RN, M, L, RN,M,L,R,表示有 NNN 座城市和 MMM 条双向通行的商路,以及小蓝心中预设的最高过路费的下限 LLL 和上限 RRR
接下来 MMM 行,每行包含三个整数 u,v,wu, v,wu,v,w,表示城市 uuu 和城市 vvv 之间有一条双向通行的商路,过路费为 www。保证每对城市之间最多只有一条直接的商路。
输出格式:
输出一行包含一个整数,表示满足条件的城市对数量。

数据范围:
对于 30% 的评测用例,1≤N≤103,1≤M≤min⁡(2×103,N×(N−1)2),1≤L≤R≤105,1≤u,v≤N,u≠v,1≤w≤1051 \le N \le 10^3,1 \le M \le \min(2 \times 10^3,\frac{N×(N−1)}{2}), 1 \le L \le R \le 10^5,1 \le u, v \le N, u \ne v,1 \le w \le 10^51N103,1Mmin(2×103,2N×(N1)),1LR1051u,vN,u=v,1w105
对于所有评测用例,1≤N≤105,1≤M≤min⁡(2×105,N×(N−1)2),1≤L≤R≤109,1≤u,v≤N,u≠v,1≤w≤1091 \le N \le 10^5,1 \le M \le \min(2 \times 10^5,\frac{N×(N−1)}{2}),1 \le L \le R \le 10^9,1 \le u, v \le N, u \ne v,1 \le w \le 10^91N105,1Mmin(2×105,2N×(N1)),1LR109,1u,vN,u=v1w109


【蓝桥杯】缴纳过路费

算法知识

  1. 并查集
  2. kruskal 最小生成树
  3. 乘法原理

题目大意

给出 nnn 个结点和 mmm 条带权边,一个结点代表一座城市,一条边表示两座城市间的直接路径(题目保证不会出现重边),并定义一条路线的成本为组成这条路线的边中的最大边权。给出 l,rl,rl,r 并定义符合要求的城市对满足这两个城市之间路径成本最小的路径的成本要在区间 [l,r][l,r][l,r] 之间,求出在所有城市中符合要求的城市对的个数。

题目不能保证图是连通的。

解题方法

fif_ifi–查并集数组,disidis_idisi–能够到达结点 iii 且最小成本路径的成本小于或等于当前边的边权的结点个数,ansansans–最终答案。

find(x)find(x)find(x) 函数为查并集中查找集合头元素的函数。

  1. 存边并按边权从小到大排序。
  2. 数组初始化,fi=i,disi=1f_i=i,dis_i=1fi=i,disi=1
  3. 按最小生成树模版遍历每一条边,结点为 u,vu,vu,v,计算 x=find(u),y=find(v)x=find(u),y=find(v)x=find(u),y=find(v),如果 x≠yx\ne yx=y 将结点 xxx 并到结点 yyy 上,再如果该边的边权属于 [l,r][l,r][l,r],那么更新 ans=ans+disx×disyans=ans+dis_x\times dis_yans=ans+disx×disy,不论 ansansans 是否更新,最后更新 disy=disy+disxdis_y=dis_y+dis_xdisy=disy+disx

AC Code

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10,M = 2e5+10;
int f[N],dis[N],ans;//f[]--查并集数组,dis[]--能够到达该结点且最小成本路径的成本小于当前边的边权的结点个数,ans--最终答案
struct node
{int x,y,z;bool operator<(const node &w)const{return z<w.z;//按边权排序(重载运算符)}
} G[M];
int find(int x)//查并集函数
{if (x==f[x]) return x;return f[x]=find(f[x]);
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);//关闭输入输出同步int n,m,l,r;cin>>n>>m>>l>>r;for (int i=0; i<m; i++){int x,y,z;cin>>x>>y>>z;G[i]= {x,y,z};//存边}sort(G,G+m);//排序(按边权排序--从小到大)for (int i=1; i<=n; i++) f[i]=i,dis[i]=1;//数组初始化for (int i=0; i<m; i++)//最小生成树模版{int x=G[i].x,y=G[i].y,z=G[i].z;int d=find(x),e=find(y);if (d!=e)//要这条边{f[d]=e;//并到结点 e 上if (z>=l&&z<=r)ans+=dis[d]*dis[e];//计算以该边的边权为最小成本路径的路径成本的满足要求的城市对dis[e]+=dis[d];//加到结点 e 上}}cout<<ans;//输出答案return 0;
}

End

感谢观看,如有问题欢迎指出。

更新日志

  1. 2025/8/30 开始书写本篇 CSDN 博客,并完稿发布。
http://www.dtcms.com/a/358686.html

相关文章:

  • Markdown 文件编辑基础教程
  • 基于YOLO8的垃圾识别检测系统(数据集+源码+文章)
  • 【开题答辩全过程】以 线上游戏商城为例,包含答辩的问题和答案
  • Java学习day_14之API(正则表达式)
  • 【LeetCode】大厂面试算法真题回忆(121) —— 经典屏保
  • 嵌入式Linux驱动开发:蜂鸣器驱动
  • 图解LLM(AI大模型)的工作原理
  • SRE命令行兵器谱之二:lsof - 解密“端口被占用”与“文件句柄泄漏”的终极侦探
  • 吴恩达机器学习作业九:kmeans聚类
  • php电子签名
  • 2025年09月计算机二级MySQL选择题每日一练——第十二期
  • Rust 登堂 之 Sized和不定长类型 DST(七)
  • LabVIEW 时间字符串处理与显示
  • 继电器的作用、选型和测量-超简单解读
  • 算法题(195):点名
  • 【学Python自动化】 2. Windows Python 解释器使用笔记
  • 【shell】Shell脚本中的if判断条件和文件测试操作符
  • “人工智能+”政策驱动下的技术重构、商业变革与实践路径研究 ——基于国务院《关于深入实施“人工智能+”行动的意见》的深度解读
  • STM32的内存分配与堆栈
  • Redis 测试:过期 key 内存释放情况
  • JVM架构图是怎样的?
  • 算法(④KMP)
  • SpringAI应用开发工程师高阶面试剧本与知识点全解析(含RAG、多租户、流式推理、企业落地场景)
  • Python3 lambda(匿名函数)
  • HBase高效并发锁:IdLock极简内存设计
  • Qt QML注册全局对象并调用其函数和属性
  • 银河麒麟Kylin系统编译安装Qt5.12.12
  • Yolov8损失函数:回顾Yolov8-Loss
  • ​导游|基于SprinBoot+vue的在线预约导游系统
  • DrissionPage 实战:高效爬取网页数据并保存为 CSV 的全流程解析