洛谷 P4294 [WC2008]游览计划
不是很会呢,但似乎抄了题解后有点明白了
sol:状态DP显然,其实是要构建一棵最小生成树一样的东西,我自己的理解(可能不是很对哦希望多多指教)f[x][y][zt]就是到x,y这个点,状态为zt,时的最小代价于是有两种转移方法:一种是若zt1|zt2=zt且zt1&zt2==0,那么f[x][y][zt]=min(f[x][y][zt],f[x][y][zt1]+f[x][y][zt2]),第二种就是跑spfa,如x1,y1和x,y联通,f[x1][y1][zt''']=min(f[x1][y1][zt'''],f[x][y][zt]+v[x1][y1]) 看起来不是很难,实现起来对菜鸡来说可费劲了qaq
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=,B=(<<),inf=1e7,dx[]={-,,,},dy[]={,,-,};
int n,m,f[N][N][B],v[N][N],tot=,SX,SY,inq[N][N],re[N][N];
queue<pair<int,int> >q;
struct node
{
int x,y,zt;
}pre[N][N][B];
inline void spfa(int zt)
{
int i,xx,yy; pair<int,int>pp;
while(!q.empty())
{
pp=q.front(); q.pop(); inq[pp.first][pp.second]=;
for(i=;i<;i++)
{
xx=pp.first+dx[i]; yy=pp.second+dy[i]; if(xx<||xx>n||yy<||yy>m)continue;
if(f[xx][yy][zt]>f[pp.first][pp.second][zt]+v[xx][yy])
{
f[xx][yy][zt]=f[pp.first][pp.second][zt]+v[xx][yy]; pre[xx][yy][zt]=(node){pp.first,pp.second,zt};
if(!inq[xx][yy]) q.push(make_pair(xx,yy)),inq[xx][yy]=;
}
}
}
}
inline void dfs(int x,int y,int zt)
{
if(!pre[x][y][zt].zt)return; re[x][y]=;
node tmp=pre[x][y][zt]; dfs(tmp.x,tmp.y,tmp.zt); if(tmp.x==x&&tmp.y==y)dfs(x,y,zt^tmp.zt);
}
int main()
{
int i,j,zt,zz; scanf("%d%d",&n,&m); memset(f,,sizeof f);
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
scanf("%d",&v[i][j]); if(!v[i][j]) f[i][j][<<tot]=,SX=i,SY=j,tot++;
}
}
for(zt=;zt<(<<tot);zt++)
{
while(!q.empty()) q.pop(); memset(inq,,sizeof inq);
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
for(zz=zt;zz;zz=zt&(zz-))
{
if(f[i][j][zt]>f[i][j][zz]+f[i][j][zt^zz]-v[i][j])
{
f[i][j][zt]=f[i][j][zz]+f[i][j][zt^zz]-v[i][j]; pre[i][j][zt]=(node){i,j,zz};
}
}if(f[i][j][zt]<inf) q.push(make_pair(i,j)),inq[i][j]=;
}
}spfa(zt);
}printf("%d\n",f[SX][SY][(<<tot)-]); dfs(SX,SY,(<<tot)-);
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
if(!v[i][j])putchar('x');else if(re[i][j])putchar('o');else putchar('_');
}puts("");
}return ;
}
洛谷 P4294 [WC2008]游览计划的更多相关文章
- 洛谷4294 [WC2008]游览计划——斯坦纳树
题目:https://www.luogu.org/problemnew/show/P4294 大概是状压.两种转移,一个是以同一个点为中心,S由自己的子集拼起来:一个是S相同.中心不同的同层转移. 注 ...
- bzoj2595 / P4294 [WC2008]游览计划
P4294 [WC2008]游览计划 斯坦纳树 斯坦纳树,是一种神奇的树.它支持在一个连通图上求包含若干个选定点的最小生成树. 前置算法:spfa+状压dp+dfs(大雾) 我们设$f[o][P]$为 ...
- luogu P4294 [WC2008]游览计划
LINK:游览计划 斯坦纳树例题. 斯坦纳树是这样一类问题:带权无向图上有K个关键点 求出包含这K个点的最小生成树. 也就是说 求最小生成树 但是 并不是整张图 仅限于K个点. 可以发现我们利用克鲁斯 ...
- P4294 [WC2008]游览计划
传送门 斯坦纳树 给一个联通图,求 $k$ 个关键点联通的最小生成树权值 设 $f[o][i]$ 表示当前关键点选择状态为 $o$ ,以点 $i$ 为根的树的最小权值 初始 $f[1<<( ...
- P4294 [WC2008]游览计划 (斯坦纳树)
题目链接 差不多是斯坦纳树裸题,不过边权化成了点权,这样在合并两棵子树时需要去掉根结点的权值,防止重复. 题目还要求输出解,只要在转移时记录下路径,然后dfs一遍就好了. #include<bi ...
- 【LG4294】[WC2008]游览计划
[LG4294][WC2008]游览计划 题面 洛谷 bzoj 题解 斯坦纳树板子题. 斯坦纳树的总结先留个坑. 代码 #include <iostream> #include <c ...
- 洛谷 P2762 太空飞行计划问题 P3410 拍照【最大权闭合子图】题解+代码
洛谷 P2762 太空飞行计划问题 P3410 拍照[最大权闭合子图]题解+代码 最大权闭合子图 定义: 如果对于一个点集合,其中任何一个点都不能到达此集合以外的点,这就叫做闭合子图.每个点都有一个权 ...
- BZOJ_2595_[Wc2008]游览计划_斯坦纳树
BZOJ_2595_[Wc2008]游览计划_斯坦纳树 题意: 分析: 斯坦纳树裸题,有几个需要注意的地方 给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值 方案记录比较麻烦,两 ...
- [WC2008]游览计划 解题报告
[WC2008]游览计划 斯坦纳树板子题,其实就是状压dp 令\(dp_{i,s}\)表示任意点\(i\)联通关键点集合\(s\)的最小代价 然后有转移 \[ dp_{i,S}=\min_{T\in ...
随机推荐
- php使用MPDF导出PDF文件自定义字体
最近公司要生成一个PDF文件,网上找了很多类库,使用mpdf最方便,通过HTML输入调整样式,官方地址:http://www.mpdf1.com/,更改字体这个问题困扰了我很久,网上找的方法都不适用, ...
- ASP.NET 加密解密
1.MD5 2.DES 一 MD5 介绍:MD5是不可逆解密方式,比如对密码的加密,为了保密,让密码不能解密 public static string MD5Encrypt(string str) { ...
- java 文件字节和字符流 缓冲流
流的原理 1) 在 Java 程序中,对于数据的输入/输出操作以“流”(stream) 方式进行:2) J2SDK 提供了各种各样的“流”类,用以获取不同种类的数据:程序中通过标准的方法输入或输出数据 ...
- js判断变量的类型(使用闭包来玩一把)
var Type = (function() { var Type = {}; for (var i = 0, type; type = ['Undefined', 'Null', 'Boolean' ...
- 18-(基础入门篇)GPRS(Air202)拨打电话--(由于板子做修订,所以暂停更新)
https://www.cnblogs.com/yangfengwu/p/9968883.html 这个直接用官方给的demo就可以 先睹为快 现在说个需求哈,是当初一个人给提出的需求 例如存入的号码 ...
- VC++编写简单串口上位机程序
VC++编写简单串口上位机程序 转载: http://blog.sina.com.cn/s/articlelist_1809084904_0_1.html VC++编写简单串口上位机程序 串口通信 ...
- Luogu4652 CEOI2017 One-Way Streets 树上差分
传送门 题意:给出$N$个点.$M$条无向边的图,现在你需要给它定向,并满足$Q$个条件:每个条件形如$(x_i,y_i)$,表示定向之后需要存在路径从$x_i$走向$y_i$.问每条边是否都有唯一定 ...
- mybatis 反射bean规则
1,根据查询字段名,寻找 bean变量名设置,变量可为私有属性 2,根据查询字段名 set方法名,设置bean属性 此方法 为 ‘set‘+字段名,大小写忽略,即 方法set后面第一个字母可以是大小写 ...
- Hexo博客搭建以及Next主题美化的经验之谈
这并不是一篇博客搭建教程.内容主要包含个人对于Hexo博客搭建的心得,Next6.0主题美化的部分建议,以及摘录一些各种用于博客搭建的link. 在博客园3年6个月,确实也学到了很多,博客园也是目前为 ...
- C#大型电商项目优化(二)——嫌弃EF与抛弃EF
上一篇博文中讲述了使用EF开发电商项目的代码基础篇,提到EF后,一语激起千层浪.不少园友纷纷表示:EF不适合增长速度飞快的互联网项目,EF只适合企业级应用等等. 也有部分高手提到了分布式,确实,性能优 ...