[BZOJ2595]游览计划
斯坦纳树居然不是数据结构...
斯坦纳树应该是类似最小生成树的问题,只不过它允许增加额外的点
比如这道题就是找关于景点的最小生成树,但还要付出最小的代价,加一些额外的格子把景点都连起来
套路是设$f_{s,i}$表示至少选$s$这个集合的点,必经$i$的最小价值,那么转移就是$f_{s,i}\gets f_{u,i}+f_{s-u,i}-v_i(u\subset s)$和$f_{s,i}\gets f_{s,j}+w_{i,j}\left(\exists(i,j)\right)$
如果$f_{u,i}$和$f_{s-u,i}$选取的额外点有重合的部分,那么第一个转移算重了这些点的权值,所以还要加一个朴素的转移
第一个转移直接枚举子集即可,第二个转移用最短路来转移
这题应该就是斯坦纳树的裸题,要输出方案的话,记每个状态由什么转移过来,最后dfs一遍即可即可
#include<stdio.h>
#include<string.h>
typedef int mt[11][11];
const int go[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
bool min(int&a,int b){
if(b<a){
a=b;
return 1;
}
return 0;
}
mt a,f[1024];
int n,m,head,tail;
bool inq[11][11];
struct zt{
int x,y;
zt(int a=0,int b=0){x=a;y=b;}
}q[100010],t;
struct fr{
int s,x,y;
fr(int a=0,int b=0,int c=0){s=a;x=b;y=c;}
bool hav(){return s|x|y;}
}g[1024][11][11];
void bfs(mt&dis){
int i,x,y;
while(head<=tail){
t=q[head];
head++;
inq[t.x][t.y]=0;
for(i=0;i<4;i++){
x=t.x+go[i][0];
y=t.y+go[i][1];
if(1<=x&&x<=n&&1<=y&&y<=m&&min(dis[x][y],dis[t.x][t.y]+a[x][y])){
g[&dis-f][x][y]=fr(&dis-f,t.x,t.y);
if(!inq[x][y]){
tail++;
q[tail]=zt(x,y);
inq[x][y]=1;
}
}
}
}
}
bool v[11][11];
void dfs(int s,int i,int j){
v[i][j]=1;
fr&f=g[s][i][j];
if(f.hav()){
dfs(f.s,f.x,f.y);
if(f.x==i&&f.y==j)dfs(s^f.s,i,j);
}
}
int main(){
int i,j,s,t,K,inf;
scanf("%d%d",&n,&m);
memset(f,63,sizeof(f));
inf=f[0][0][0];
K=0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
scanf("%d",a[i]+j);
if(a[i][j]==0){
f[1<<K][i][j]=0;
K++;
}
}
}
for(s=0;s<1<<K;s++){
head=1;
tail=0;
memset(inq,0,sizeof(inq));
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
for(t=s;t;t=(t-1)&s){
if(min(f[s][i][j],f[t][i][j]+f[s^t][i][j]-a[i][j]))g[s][i][j]=fr(t,i,j);
}
if(f[s][i][j]!=inf){
tail++;
q[tail]=zt(i,j);
inq[i][j]=1;
}
}
}
bfs(f[s]);
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(a[i][j]==0){
printf("%d\n",f[(1<<K)-1][i][j]);
dfs((1<<K)-1,i,j);
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(a[i][j]==0)
putchar('x');
else if(v[i][j])
putchar('o');
else
putchar('_');
}
putchar('\n');
}
return 0;
}
}
}
}
[BZOJ2595]游览计划的更多相关文章
- 【BZOJ2595】 [Wc2008]游览计划
BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...
- 【BZOJ2595】[Wc2008]游览计划 斯坦纳树
[BZOJ2595][Wc2008]游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为 ...
- BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*
BZOJ2595 Wc2008 游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个 ...
- [bzoj2595][WC2008]游览计划/[bzoj5180][Baltic2016]Cities_斯坦纳树
游览计划 bzoj-2595 wc-2008 题目大意:题目链接.题目连接. 注释:略. 想法:裸题求斯坦纳树. 斯坦纳树有两种转移方式,设$f[s][i]$表示联通状态为$s$,以$i$为根的最小代 ...
- bzoj2595 / P4294 [WC2008]游览计划
P4294 [WC2008]游览计划 斯坦纳树 斯坦纳树,是一种神奇的树.它支持在一个连通图上求包含若干个选定点的最小生成树. 前置算法:spfa+状压dp+dfs(大雾) 我们设$f[o][P]$为 ...
- 【BZOJ-2595】游览计划 斯坦纳树
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1518 Solved: 7 ...
- BZOJ_2595_[Wc2008]游览计划_斯坦纳树
BZOJ_2595_[Wc2008]游览计划_斯坦纳树 题意: 分析: 斯坦纳树裸题,有几个需要注意的地方 给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值 方案记录比较麻烦,两 ...
- [WC2008]游览计划 解题报告
[WC2008]游览计划 斯坦纳树板子题,其实就是状压dp 令\(dp_{i,s}\)表示任意点\(i\)联通关键点集合\(s\)的最小代价 然后有转移 \[ dp_{i,S}=\min_{T\in ...
- 【LG4294】[WC2008]游览计划
[LG4294][WC2008]游览计划 题面 洛谷 bzoj 题解 斯坦纳树板子题. 斯坦纳树的总结先留个坑. 代码 #include <iostream> #include <c ...
随机推荐
- document的属性与方法小结
document节点是文档的根节点,每张网页都有自己的document节点.属性:1:document.doctype----它是一个对象,包含了当前文档类型 (Document Type Decla ...
- Ribbon自带负载均衡策略比较
Ribbon自带负载均衡策略比较 策略名 策略声明 策略描述 实现说明 BestAvailableRule public class BestAvailableRule extends ClientC ...
- hdfs基本思想
1.hdfs的优缺点 (1)不适合大量小文件存储: (2)不适合并发写入,不支持文件随机修改:(只能append追加) (3)不支持随机读等低延时的访问方式 2.基本思想 主从结构 主节点, name ...
- perl中的lock
#!/usr/bin/env perl -w use strict; use threads; use threads::shared; ; print "count的起始值为:$count ...
- C++学习之路(三):volatile关键字
volatile是c++中的一个关键字.用volatile修饰的变量,具有三个性质:易变性 (一)易变性: 由于编译器对代码执行的优化,两条赋值语句,下一条语句可能会直接从上一条语句使用的寄存器中取得 ...
- CSS浮动和清除
float:让元素浮动,取值:left(左浮动).right(右浮动) clear:清除浮动,取值:left(清除左浮动).right(清除右浮动).both(同时清除上面的左浮动和右浮动) 1.CS ...
- python基础===基于requests模块上的协程【trip】
今天看博客get了一个有趣的模块,叫做 trip #(pip install trip) 兼容2.7版本 基于两大依赖包:TRIP: Tornado & Requests In Pa ...
- pxc群集搭建
pxc群集搭建 1.环境 Percona-XtraDB 5.7.22-22-29.26-log percona-xtrabackup-24-2.4.12 192.168.99.210:3101(第一节 ...
- python并发模块之concurrent.futures(一)
Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threadin ...
- VS2017MVC+EF+MySQL环境搭建
记录一次环境搭建的过程以及出现的问题和解决方法. 编译器Visual Studio 2017Enterprise Edition 1.新建一个MVC应用程序2.在新建的MVC程序中选择Models - ...