斯坦纳树
斯坦纳树
problem : 给定一个无向图,求一个连通 k 个关键节点的边权最小的子图。
k = 10
sol :
显然,求的是一颗树。
考虑对 k 那一维状压 dp。
设 f[s][i] ,s 是状压的 k,代表钦定 i 为树根, i 到点集 s 的最小代价。
- 点 i 度数为 1,
f[s][i] <- f[s][j] + w(i, j),j 是枚举 i 连接的点,w(i,j)就是边 i 到 j 的边权 。 - 点 i 的度数不为 1,划分集合 s 为 (T,S / T),
f[s][i] <- f[T][i] + f[S-T][i]。
初学时有一个我对转移 1 有一个疑惑,就是如果 i 是关键点并且 i 在集合 s 中的时候这个东西会不会有问题?
如果 i 是关键点,初始化 f[(1<<i)][i] = 0 ,其他初始化为 inf 即可,因为转移 1 先处理了 f[s/i][i] ,然后通过转移 2 ,f[s][i] = f[s/i][i]。故没有问题。
对于第一个转移,如果把 f[s][i] 看成 dis[i] 那么就是最短路的松弛操作。对于每个 S 跑 spfa。
第二个转移,直接枚举子集做 for (int T = S & (S - 1); T; T = (T - 1) & S) 。
复杂度:\(O(n3^k+nm2^k)\)。

浙公网安备 33010602011771号