斯坦纳树(Steiner Tree)

来源:互联网 发布:在线答题软件高中 编辑:程序博客网 时间:2024/04/30 09:18

简述

斯坦纳树可以用来求包含给定点的最小生成树,给定点数目通常为 10  左右。

f[s][i]  表示连通性至少为 s ,且经过 i  点的最小生成树大小
方程1. f[s][i]=min(f[ss][i]+f[sss][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;}
0 0