orz,感觉对最小生成树的理解又加进了一步。ps:不得不说对于经典算法的探究是永无止境的,只能通过交流和增长见识来学习和体会,自己研究确实困难。
让我们来深入分析一下kruskal算法。算法过程不多说,直接证明:假设算法考虑到第k条边,这时发现边的两端已经在同一个连通块里面了(称为“冲突”),为了使这条边加入这个连通块之后仍然保持树的性质,我们定要从成的环上删去一条边,而之后连通性并未发生改变,但由于删去的边权不大于当前边权,所以答案不会更优,证毕。
对于这道题,我们要看到通过kruskal算法求最小生成树的过程的分析得出的一个性质:如果相同权的边C有K条,那么在考虑下一种边权时,不同的加入法被加入连通状态的边C数量相同,且点的连通状态相同。即:一个图的最小生成树相同边权的边的数量一定相等,且加入这些边之后形成的连通状态也相同。证明:将相同的边权分成一个加边阶段,对于当前阶段的边C设其有K条。假设在考虑到K中的第T条时发生了冲突,有两种情况:若形成的环中有之前加入过的C边,那么可以将其替换从而连通状态不会改变;若没有,当前K值边不能加入且之后的K值边也无法加入。上述两种情况都不会增加加入边的数量和改变连通状态,得证。
所以就愉快的kruskal暴力并查集维护连通性+搜索,每个阶段可能的加边方案数累乘起来就行了。注意特判无解情况(因为上述做法会在无解时输出1)。代码网上多的是23333。matrix-tree定理貌似用不了啊??求神犇(特指ydc)讲解2333.