最小斯坦纳树
最小斯坦纳树 问题描述: 给定一个包含 \(n\) 个结点和 \(m\) 条带权边的无向连通图 \(G=(V,E)\) 。 再给定包含 \(k\) 个结点的点集 \(S\) ,选出 \(G\) 的子图 \(G'=(V',E')\) 使得: \(S\subseteq V'\) \(G′\) 为连通图; \(E′\) 中所有边的权值和最小。 你只需要求出 \(E′\) 中所有边的权值和。 分析: \(dp[i][s]\) 表示 以 i 为根的一棵树,包含集合 S 中所有点的最小代价 \(i\) 号点不一定在 \(s\) 中 \(w[i][j] + dp[j][s] -> dp[i][s]\) \(dp[i][T] + dp[i][S-T] -> dp[i][S]\quad(T \subseteq S)\) 第二类转移可以用枚举子集来转移,第一类转移是一个三角不等式,可以用 \(spfa\) 或者 \(dijkstra\) 第一类转移复杂度为 \(O(m\log m \times 2^k)\) 第二类转移复杂度为 \(O(n\times 3^n)\) ,子集枚举的时间复杂度可以用二项式定理求出 代码: const int N = 100 + 5; const int M = 1010; int n, m, k, x, y, z, tot; int head[N], ver[M], nxt