Roads [最小生成树]

n \frak{n} n m \frak{m} m边图,边权互异且为 2 C i \frak{2^{Ci}} 2Ci
a \frak{a} a b \frak{b} b最短路 d ( a , b ) \frak{d(a,b)} d(a,b)
∑ a = 1 n − 1 ∑ b = a + 1 n d ( a , b ) \frak{\sum\limits_{a=1}^{n-1}\sum\limits_{b=a+1}^n d(a,b)} a=1n1b=a+1nd(a,b)
在二进制下输出。
1 ≤ n ≤ 1 0 5 , 1 ≤ m ≤ 2 × 1 0 5 , 1 ≤ C i ≤ m . \frak{1\le n\le 10^5,\quad1\le m\le 2×10^5, \quad1\le Ci\le m.} 1n105,1m2×105,1Cim.


全源最短路和好像还要 m l o g m \frak{mlogm} mlogm,怕了 . j p g \frak{.jpg} .jpg
题目比较特殊的性质就只有那个 2 C i \frak{2^{Ci}} 2Ci了。
我们知道, 2 n = 1 + ∑ i = 1 n − 1 2 i \frak{2^{n}=1+\sum\limits_{i=1}^{n-1}2^{i}} 2n=1+i=1n12i
那——选一个长边不如选所有的短边。

考虑到全源最短路不可行是因为要对于每个源做一次。
现在要降低复杂度的关键点就在于把“枚举源点”这一步去掉(否则肯定不行)
如何利用“能够用所有短边到达就不走长边”这一个性质呢?

树上路径计数有种套路提供的思路是枚举边,把图分为两个连通块统计贡献。
图上倒是没有多少这样的情况。这道题目就只能用统计边的贡献的方法来降低复杂度了。
最短路的做法到这里已经确定是不行了。能不能用某种思路来把图变成树?
生成树?
最小生成树是求 m i n ( ∑ w i ) \frak{min(\sum w_i)} min(wi)
然后发现这道题里面也有一个 2 n > ∑ i = 1 n − 1 2 i \frak{2^n > \sum\limits_{i=1}^{n-1}2^{i}} 2n>i=1n12i
后面那个就是某一部分的 ∑ w i \frak{\sum w_i} wi


如果能够求到 m i n ( ∑ w i ) \frak{min(\sum w_i)} min(wi),那么就知道加的边最多是什么了。
最小生成树的 ∑ w i \frak{\sum w_i} wi是最小的,肯定不会比最短路树的大。
最短路树也不应该出现超过它的边,不然就可以被最小生成树取代了。
最小生成树上的边会不会就是最短路经过的边?
显然地。
假如某个点到某个点的最短路选了某个边,最小生成树一定会经过。反之亦然。
因为选了这条边意味着选比它小的所有边都形成不了最短路。
也就是说,都不能让两个点连通。

C o d e \frak{Code} Code没办法 J u d g e \frak{Judge} Judge,不保证正确性,就不填了(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值