简述
斯坦纳树可以用来求包含给定点的最小生成树,给定点数目通常为 10 左右。
f[s][i] 表示连通性至少为 s ,且经过
i 点的最小生成树大小
方程1. f[s][i]=min(f[ss][i]+f[s−ss][i]) 其中 ss 为 s 的子集
方程2.f[s][i]=min(f[s][j]+mp[i][j]) 其中 i,j 之间有边相连
代码
int steiner(){
for(int s = 1; s <= maxs; ++s)
for(int i = 1; i <= n; ++i)
f[s][i] = inf;
for(int i = 1; i <= m; ++i) f[1<<(i-1)][id[i]] = 0; // 给必须选的m个点对应的状态赋初值
for(int s = 1; s <= maxs; ++s){
for(int i = 1; i <= n; ++i){
for(int ss = s & (s - 1); ss; ss = s & (ss - 1))
f[s][i] = min(f[s][i], f[ss][i] + f[s^ss][i]); // 枚举s的子集ss
if(f[s][i] != inf) que.push(i);
}
spfa(f[s]); // spfa(int dist[]) {}
}
int rtn = inf;
for(int i = 1; i <= n; ++i) rtn = min(rtn, f[maxs][i]);
return rtn;
}
本文介绍了斯坦纳树的概念,它是图论中的一个问题,旨在找到包含特定点集的最小生成树。通过动态规划方法,利用两个关键方程来求解问题,即连接不同子集的最小生成树和考虑节点间边的最小代价。文章还提供了相关代码实现。
1978

被折叠的 条评论
为什么被折叠?



