[Wc2008]游览计划【斯坦纳树】

斯坦纳树的问题模型是:有一个图,要求保留图中最少的边/最小的边权和使得某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]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值