部分表述来源于李煜东的《算法竞赛进阶指南》。
题意
求满足如下条件的无向连通图数量:
- 由 n n n 个节点组成,每个节点有编号,编号为 1 ∼ n 1\sim n 1∼n;
- 割边数量 ≤ m \leq m ≤m 条;
- 无自环,无重边。
数据范围 2 ≤ n ≤ 50 , 0 ≤ m ≤ n ∗ ( n − 1 ) 2 2\leq n\leq50,0\leq m\leq \frac{n*(n-1)}2 2≤n≤50,0≤m≤2n∗(n−1),输出答案对 1 0 9 + 7 10^9+7 109+7 取模的值。
题解
首先有个结论:
在无向图中,不含割边的极大连通子图称为双连通分量。若把每个双连通分量看做一个节点,则所有双连通分量和割边构成一棵树。
很容易理解:如果最后不构成树(有环),则环上的所有双连通分量必定能构成一个更大的双连通分量。
设 f i , j f_{i,j} fi,j 表示 i i i 个点包含 j j j 条割边的无向连通图数量。首先考虑 j > 0 j>0 j>0(下面解释为什么)。
计数 dp 有个思想:“围绕基准点构造一个整体”。我们以编号为 1 1 1 的节点为“基准点”,枚举 1 1 1 所在双连通分量节点数 k k k。这个双连通方案的构造方案数为 f k , 0 × C i − 1 k − 1 f_{k,0}\times C_{i-1}^{k-1} fk,0×Ci−1k−1( i − 1 i-1 i−1 个节点选 k − 1 k-1 k−1 个与 1 1 1 构成大小为 k k k 的双连通分量)。
如果 j = 0 j=0 j=0,那么 k k k 只能取 i i i 按照上式, f i , j = f k , 0 × C i − 1 k − 1 f_{i,j}=f_{k,0}\times C_{i-1}^{k-1} fi,j=fk,0×Ci−1k−1,我等于我自己了。
现在不考虑 j = 0 j=0 j=0,考虑图中其他部分。去掉 1 1 1 号节点所在的双连通分量,无向图会分成若干连通块,从每个连通块出发都有一条边连接到 1 1 1 号点所在的双连通分量上(这条边即为割边)。
设 g i , j , k g_{i,j,k} gi,j,k 表示 i i i 个点包含 j j j 条割边的有 k k k 个连通块的“有根”无向图数量,其中的“根”即为与 1 1 1 号点所在的双连通分量连边的那个节点。在此处处理更加简便。则去掉 1 1 1 号点所在的双连通分量后,图中剩余部分方案数为 g i − k , j − x , x g_{i-k, j-x,x} g