我们对于编号的分配,很明显可以发现如下的分配就是期望最小的:对经过的期望次数越大的边赋予更小的编号。
那么问题就转化为了怎么求一条边的经过的期望次数,我们发现边数非常大所以肯定不好弄,所以我们就转而看很少的点。因为我们会发现如果我们能知道经过每个点的期望次数,那么这条边的期望次数很轻松就能表达出来。
比如如下的式子:(设 ans[i] 为经过第 i 个点的期望次数, du[i] 为第 i 个点的度数, res[i] 为经过第 i 条边的期望次数)
注意 to 是指所有与 i 有边直接相连的点,to 不包含 n 号节点,因为这个式子的含义从是 to 等概率地回到 i 节点,可是 n 号节点就停了,也就不存在再走回来的情况了
但是其实还有一种特殊情况,就是对于 1 号节点,其作为初始节点所以一定在开始时被经过一次,所以其不仅要计算从别的点到来的期望次数,更要算其一开始的这一次
ans[1]=1+∑du[to]ans[to]
我们会发现上文的这个式子会出现循环依赖的情况,就是假设 A 的值需要 B 的值才能推出来,但是 B 也同样需要 A 才能推出来。而且我们考虑这个式子不含有最大值最小值的操作,所以就考虑使用高斯消元,把这个式子化成一个方程,然后求解.
那么既然要高斯消元就要考虑我们的未知数是什么,我们的系数是什么,常数是什么,这一切都是根据我上面的式子得出来的.
首先未知数肯定非常容易,就是我们不知道的数嘛,那我们不知道什么?就是 ans 数组啊,所以 ans 就是我们的未知数, ans[i] 就代表我们的第 i 个未知数.
这个明白了之后剩下的就非常简单的,考虑对上面的式子进行转化
ans[i]−∑du[to]1×ans[to]=0
很明显 du 数组我们是知道的,又发现有一个 du[to]1×ans[to] 的项,所以 du 数组就理所应当的成为了我们的系数
会发现了常数项除了 ans[1] 的方程含有一个 1 ,其他的都是 0.
注意在代码里我的 a 数组开的二维,因为我们的高斯消元需要知道第几个方程,所以就按照第一个点的顺序给方程编了号,所以 a 数组的第一维就是编号,第二维才是我们的未知数,这也就与正常的高斯消元一样了