斯坦纳树的问题模型是:有一个图,要求保留图中最少的边/最小的边权和使得某k个点相互连通。最小生成树是斯坦纳树的一种特殊情况。
我们用f[i]][j][s]表示方格中i,j位置与各个景点之间的联通情况。
如果景点数为3时,111表示全部联通, 101表示第二个景点没有联通。。。
当然第x个景点的 f[i][j][(1<<x)] = 0,其他的情况先初始化为inf。
状态怎么转移?
有两种情况
1.某个状态的子状态(11011->10001)。
2.相邻的位置转移过来的。
子状态的话需要知道一个枚举子状态的技巧:
for(int s = st&(st-1); s; s = st&(s-1))
相邻的状态转移就要用spfa了。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1<<12;
int Case = 1;
int n, m, cc[12][12], f[12][12][maxn], vis[12][12], res[12][12];
int dr[4][2] = {
{
1, 0}, {
0, 1}, {
-1, 0}, {
0, -1}};
queue<pair<int, int> >Q;
struct node{
int i, j, s;
}pre[12][12][maxn];
void dfs(int x, int y, int s) {
if(!pre[x]