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

【蓝桥杯】省赛:缴纳过路费(并查集)

在这里插入图片描述

思路

这题很有意思,路线以最贵的那一段收费w为标准,而只要w在区间[l,r]之间即可。
所以城市对之间必须至少有一段路价格不小于l,至于大于r(超费)的输入,直接不理他(不加入图)即可。
最后求的是城市对的数量,可以用并查集,把路段价格小于R满足的城市加入到集合A中,再把所有路段价格小于l的城市再存入另一个集合B,最后两两组合配对,从集合A中所有配对数量减去B中配对数量。所以额外需要记录根节点的size
p a i r = ( n − 1 ) + ( n − 2 ) + . . . + 1 = n ∗ ( n − 1 ) / / 2 pair = (n-1) + (n-2)+...+1=n*(n-1)//2 pair=(n1)+(n2)+...+1=n(n1)//2
最终
a n s = p a i r A − p a i r B ans = pairA-pairB ans=pairApairB

code

因为要创建两个并查集,这里把并查集封装成对象更好,但是不熟悉我就用参数a来区分两个集合了,稍微麻烦。

import os
import sys

def find(x,a):
  if a==1:
    if father1[x]==x:return x
    father1[x] = find(father1[x],a)
    return father1[x]
  if a==2:
    if father2[x]==x:return x
    father2[x] = find(father2[x],a)
    return father2[x]

def merge(x,y,a):
  if a==1:
    fx = find(x,a)
    fy = find(y,a)
    if fx != fy:
      father1[fy] = fx
      size1[fx] += size1[fy]
      size1[fy] = 1
  if a==2:
    fx = find(x,a)
    fy = find(y,a)
    if fx != fy:
      father2[fy] = fx
      size2[fx] += size2[fy]
      size2[fy] = 1

def cal(x):
  return x*(x-1)//2

n, m, L, R = map(int, input().split())
road = []

father1 = list(range(n+1))
size1 = [1 for i in range(n+1)]
father2 = list(range(n+1))
size2 = [1 for i in range(n+1)]
for i in range(m):
  u, v, w = map(int, input().split())
  if w <= R: merge(u,v,1)
  if w < L: merge(u,v,2)

ans = 0
for i in range(1,n+1):
  if i==find(i,1):
    ans += cal(size1[i])
  if i==find(i,2):
    ans -= cal(size2[i])
print(ans)

http://www.kler.cn/a/593482.html

相关文章:

  • nacos安装,服务注册,服务发现,远程调用3个方法
  • 降低时间复杂度---一起来ABC
  • (超详细) ETL工具之Kettle
  • C# 事件机制详解:定义、订阅、触发与应用实践
  • PLC控制柜在技术创新驱动中功能演进 尤劲恩科技
  • 【自用】NLP算法面经(5)
  • MySQL InnoDB引擎中Redo Log、Binlog、Undo Log的原理、执行顺序
  • 【css酷炫效果】纯CSS实现火焰文字特效
  • 【病毒分析】伪造微软官网+勒索加密+支付威胁,CTF中勒索病毒解密题目真实还原!
  • Spring Boot配置与注解的使用
  • 力扣105. 从前序与中序遍历序列构造二叉树(Java实现)
  • 内网渗透练习-红日靶场一
  • pytorch3d学习(四)——批处理(实现多obj文件读取)
  • Unity3D开发AI桌面精灵/宠物系列 【二】 语音唤醒 ivw 的两种方式-Windows本地或第三方讯飞等
  • 【AI知识】导数,偏导,梯度的解释
  • 内网安全-横向移动Kerberos 攻击SPN 扫描WinRMWinRSRDP
  • 详细解析GetOpenFileName()
  • 如何打造安全稳定的亚马逊采购测评自养号下单系统?
  • Solana笔记案例:写一个SOL转账程序
  • C#:使用UDP协议实现数据的发送和接收