[WC2008]游览计划

斯坦纳树板子题,其实就是状压dp

令\(dp_{i,s}\)表示任意点\(i\)联通关键点集合\(s\)的最小代价

然后有转移

\[dp_{i,S}=\min_{T\in S}dp_{i,S}+dp_{i,S \ xor\ T}-cost_i
\]

这是自己转移自己

\[dp_{u,S}=\min_{(u,v)\in E}dp_{v,S}+cost_u
\]

这是从别人转移

我们按\(S\)分层去做,注意到别人转移是无后效性的,但长的像松弛,直接跑spfa就可以了


Code:

#include <cstdio>
#include <cstring>
#include <queue>
const int inf=0x3f3f3f3f;
int n,m,k,dp[11][11][1<<10],cost[11][11],vis[11][11];
struct node
{
int x,y,s;
node(){}
node(int X,int Y,int S){x=X,y=Y,s=S;}
}pre[11][11][1<<10];
#define mp(a,b) std::make_pair(a,b)
std::queue <std::pair <int,int> > q;
const int dx[5]={0,-1,0,1,0};
const int dy[5]={0,0,1,0,-1};
void spfa(int s)
{
while(!q.empty())
{
int x=q.front().first,y=q.front().second;
q.pop();
vis[x][y]=0;
for(int i=1;i<=4;i++)
{
int tx=x+dx[i],ty=y+dy[i];
if(tx&&ty&&tx<=n&&ty<=m&&dp[tx][ty][s]>dp[x][y][s]+cost[tx][ty])
{
dp[tx][ty][s]=dp[x][y][s]+cost[tx][ty];
pre[tx][ty][s]=node(x,y,s);
if(!vis[tx][ty]) q.push(mp(tx,ty)),vis[tx][ty]=1;
}
}
}
}
void dfs(int x,int y,int s)
{
if(!x||!y||!s) return;
vis[x][y]=1;
int tx=pre[x][y][s].x,ty=pre[x][y][s].y,t=pre[x][y][s].s;
dfs(tx,ty,t^s);
dfs(tx,ty,t);
}
int main()
{
scanf("%d%d",&n,&m);
memset(dp,0x3f,sizeof dp);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&cost[i][j]);
if(cost[i][j]) dp[i][j][0]=cost[i][j];
else dp[i][j][1<<k++]=0;
}
for(int s=1;s<1<<k;s++)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
for(int t=s;t;t=t-1&s)
if(dp[i][j][s]>dp[i][j][t]+dp[i][j][s^t]-cost[i][j])
{
dp[i][j][s]=dp[i][j][t]+dp[i][j][s^t]-cost[i][j];
pre[i][j][s]=node(i,j,t);
}
if(dp[i][j][s]<inf) q.push(mp(i,j)),vis[i][j]=1;
}
spfa(s);
}
int tx=0,ty=0,s=(1<<k)-1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(dp[i][j][s]<dp[tx][ty][s])
tx=i,ty=j;
printf("%d\n",dp[tx][ty][s]);
dfs(tx,ty,s);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
putchar(vis[i][j]?(cost[i][j]?'o':'x'):'_');
putchar('\n');
}
return 0;
}

2019.2.26

[WC2008]游览计划 解题报告的更多相关文章

  1. BZOJ_2595_[Wc2008]游览计划_斯坦纳树

    BZOJ_2595_[Wc2008]游览计划_斯坦纳树 题意: 分析: 斯坦纳树裸题,有几个需要注意的地方 给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值 方案记录比较麻烦,两 ...

  2. bzoj2595 / P4294 [WC2008]游览计划

    P4294 [WC2008]游览计划 斯坦纳树 斯坦纳树,是一种神奇的树.它支持在一个连通图上求包含若干个选定点的最小生成树. 前置算法:spfa+状压dp+dfs(大雾) 我们设$f[o][P]$为 ...

  3. 【BZOJ2595】 [Wc2008]游览计划

    BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...

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

    [BZOJ2595][Wc2008]游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为 ...

  5. 【LG4294】[WC2008]游览计划

    [LG4294][WC2008]游览计划 题面 洛谷 bzoj 题解 斯坦纳树板子题. 斯坦纳树的总结先留个坑. 代码 #include <iostream> #include <c ...

  6. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)

    2595: [Wc2008]游览计划 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1572  Solved: 7 ...

  7. BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*

    BZOJ2595 Wc2008 游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个 ...

  8. [bzoj2595][WC2008]游览计划/[bzoj5180][Baltic2016]Cities_斯坦纳树

    游览计划 bzoj-2595 wc-2008 题目大意:题目链接.题目连接. 注释:略. 想法:裸题求斯坦纳树. 斯坦纳树有两种转移方式,设$f[s][i]$表示联通状态为$s$,以$i$为根的最小代 ...

  9. luogu P4294 [WC2008]游览计划

    LINK:游览计划 斯坦纳树例题. 斯坦纳树是这样一类问题:带权无向图上有K个关键点 求出包含这K个点的最小生成树. 也就是说 求最小生成树 但是 并不是整张图 仅限于K个点. 可以发现我们利用克鲁斯 ...

随机推荐

  1. PhpStorm的注册激活方法

    首先,需要修改本地的hosts文件(路径一般为C:\Windows\System32\drivers\etc\hosts),添加下面这行代码. 0.0.0.0 account.jetbrains.co ...

  2. MySQL 主从同步遇到的问题及解决方案

    在做某个项目的时候,使用主从数据库,master负责update.delete.insert操作,而slave负责select操作. 情景1:发表文章与查看文章 可以认为这个项目是一个博客系统,这里就 ...

  3. Executor介绍

    1.Executor介绍: Executor是mybatis的核心接口之一,其中定义了数据库操作的基本方法,它的子类结构图如下:这这张关系图中,涉及到了模板方法模式和装饰器模式.BaseExecuto ...

  4. MySQL 字段内容区分大小写

    数据由Oracle 迁入MySQL ,由于之前Oracle区分大小写,MySQL的配置使用了默认配置,导致一些数据导入失败,有的唯一键报错,冲突. 将测试过程记录在下面. 数据库版本:MySQL 5. ...

  5. RocketMQ消息队列安装

    一.官方安装文档 http://rocketmq.apache.org/docs/quick-start/ 下载地址 https://github.com/apache/rocketmq/releas ...

  6. Python2.7从入门到精通

    快速入门 1.程序输出print语句 (1)使用print语句可查看对象的值:在交互式解释器使用对象本身则输出此对象的字符串表示: (2)使用print语句调用str()显示对象:在交互式解释器使用对 ...

  7. Mysql Router 的集群

    1. c:\mysql-router, c:\mysql-5.7.23, 这两个目录的bin都要加入path 2. c:\mysql-shell,在bin下,有一个 mysqlsh.exe, 双击,打 ...

  8. python易混易乱(2)

    字符串切割成列表: 以str为分隔符切片mystr,如果maxsplit有指定值,则仅分割maxsplit个字符串,得到maxsplit个字符串的列表 利用字符串的split() 方法 >> ...

  9. vs code安装

    vs code是一款文本编辑器,开源,是前端界的vs,而Dreamweaver适合入门. user版本的一些系统分区文件夹无法创建,可能存在语言显示问题.一般用户建议使用system版. 下载链接:h ...

  10. Jenkins+PowerShell持续集成环境搭建(五)SSRS项目

    部署SSRS项目的原理是使用ReportingService2005类的方法实现rdl文件上传等功能. 上传rdl文件的脚本示例: $username="Victor"; $pas ...