当前位置: 首页> 游戏> 评测 > ppt素材大全免费图片_哪个公司的微信商城系统_广州权威发布_广州seo网站公司

ppt素材大全免费图片_哪个公司的微信商城系统_广州权威发布_广州seo网站公司

时间:2025/7/11 18:38:31来源:https://blog.csdn.net/2301_77168269/article/details/146325895 浏览次数:1次
ppt素材大全免费图片_哪个公司的微信商城系统_广州权威发布_广州seo网站公司

在这里插入图片描述

思路

这题很有意思,路线以最贵的那一段收费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 sysdef find(x,a):if a==1:if father1[x]==x:return xfather1[x] = find(father1[x],a)return father1[x]if a==2:if father2[x]==x:return xfather2[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] = fxsize1[fx] += size1[fy]size1[fy] = 1if a==2:fx = find(x,a)fy = find(y,a)if fx != fy:father2[fy] = fxsize2[fx] += size2[fy]size2[fy] = 1def cal(x):return x*(x-1)//2n, 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)
关键字:ppt素材大全免费图片_哪个公司的微信商城系统_广州权威发布_广州seo网站公司

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: