题目:
乡下有n(n<=8)个小村庄,用m条双向道路连接起来,每两个村庄最多用一条道路直接连接。最近村庄闹涝灾,洪水让这些道路各有一定的概率被淹没,而这些道路被淹没与否是相互独立的。你的任务是计算出所有村庄连在一起(即:从任意一个村庄都可以经过未被淹没的道路到达其他所有村庄)的概率有多大。
分析:n=8,显然不是裸搜就是状态压缩dp,裸搜显然也是很难过的,那么本题的方向就出来了
算法:
记f[i]表示i这个状态中所有的点连通的概率,如果直接把要选的点分成2个集合什么的做法是会算重的
而为了避免算重,我们需要规定一些东西,比方说可以这样规定:先孤立出所选集合中的第一个点,然后枚举其他点的连通情况,且其他点形成的连通块之间不能直接相连,只能和这个孤立出的点相连,如图
里面需要套一个搜其他点连通情况的dfs,惊奇发现大过程套小过程,小过程还可以调用大过程,而且大过程的局部变量是小过程的全程变量,只是debug的时候监控不了,使我郁闷好久,考完才想到解决办法。。
大部分概率计算都比较飘,这题也不例外,我差不多花了一个多小时才晓得样例是怎么搞的。。。
这题数据规模真是小,我这个O(2^n*n!*n^2)居然全0ms啦,哈哈。