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=1∑n−1b=a+1∑nd(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.} 1≤n≤105,1≤m≤2×105,1≤Ci≤m.
全源最短路和好像还要
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=1∑n−12i
那——选一个长边不如选所有的短边。
考虑到全源最短路不可行是因为要对于每个源做一次。
现在要降低复杂度的关键点就在于把“枚举源点”这一步去掉(否则肯定不行)
如何利用“能够用所有短边到达就不走长边”这一个性质呢?
树上路径计数有种套路提供的思路是枚举边,把图分为两个连通块统计贡献。
图上倒是没有多少这样的情况。这道题目就只能用统计边的贡献的方法来降低复杂度了。
最短路的做法到这里已经确定是不行了。能不能用某种思路来把图变成树?
生成树?
最小生成树是求
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=1∑n−12i。
后面那个就是某一部分的
∑
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,不保证正确性,就不填了(