斯坦纳树

斯坦纳树

problem : 给定一个无向图,求一个连通 k 个关键节点的边权最小的子图。

k = 10

sol :

显然,求的是一颗树。

考虑对 k 那一维状压 dp。

f[s][i] ,s 是状压的 k,代表钦定 i 为树根, i 到点集 s 的最小代价。

  1. 点 i 度数为 1, f[s][i] <- f[s][j] + w(i, j),j 是枚举 i 连接的点,w(i,j) 就是边 i 到 j 的边权 。
  2. 点 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)\)

posted @ 2025-07-10 17:06  花子の水晶植轮daisuki  阅读(11)  评论(1)    收藏  举报
https://blog-static.cnblogs.com/files/zouwangblog/mouse-click.js