传送门
思路
因为边数很多,所以如果我们考虑用边来设立状态的话,会直接爆掉
考虑到期望有线性性,我们将边拆成独立的贡献
对于边 \((u,v)\),它被经过的期望实际上就是 \(\frac{E_u}{d_u}+\frac{E_v}{d_v}\)(\(E(u)\) 表示点 \(u\) 被经过的期望)
最后的答案就是:每条边被经过的期望\(\times\)它的边权,所以我们设边权的时候可以用贪心(被经过的期望越大,边权越小)
因此我们考虑如何求出点被经过的期望
我们其实有如下转移方程:
\[\begin{aligned}
E_1&=\sum_{(1,j)\in Edge\ and\ j \not = n}\frac{E_j}{d_j}+1\\
E_i&=\sum_{(i,j)\in Edge\ and\ j \not = n}\frac{E_j}{d_j}\ (i>1)\\
\end{aligned}\]
\(E_1\) 要加 \(1\) 是因为开始就在 \(1\) 号点,因此 \(100%\) 会经过 \(1\) 先
\(j\not = n\) 是因为到了 \(n\) 就停了,不可能从 \(n\) 转移
这样我们就可以用高斯消元做了
最后吐槽一个点:为什么用结构体排序那么慢啊,不开 \(O_2\) 都过不了......
代码
#include
#include
#include
#include
#include
#include
#include
#include