题目链接

不是很会呢,但似乎抄了题解后有点明白了

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]游览计划的更多相关文章

  1. 洛谷4294 [WC2008]游览计划——斯坦纳树

    题目:https://www.luogu.org/problemnew/show/P4294 大概是状压.两种转移,一个是以同一个点为中心,S由自己的子集拼起来:一个是S相同.中心不同的同层转移. 注 ...

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

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

  3. luogu P4294 [WC2008]游览计划

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

  4. P4294 [WC2008]游览计划

    传送门 斯坦纳树 给一个联通图,求 $k$ 个关键点联通的最小生成树权值 设 $f[o][i]$ 表示当前关键点选择状态为 $o$ ,以点 $i$ 为根的树的最小权值 初始 $f[1<<( ...

  5. P4294 [WC2008]游览计划 (斯坦纳树)

    题目链接 差不多是斯坦纳树裸题,不过边权化成了点权,这样在合并两棵子树时需要去掉根结点的权值,防止重复. 题目还要求输出解,只要在转移时记录下路径,然后dfs一遍就好了. #include<bi ...

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

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

  7. 洛谷 P2762 太空飞行计划问题 P3410 拍照【最大权闭合子图】题解+代码

    洛谷 P2762 太空飞行计划问题 P3410 拍照[最大权闭合子图]题解+代码 最大权闭合子图 定义: 如果对于一个点集合,其中任何一个点都不能到达此集合以外的点,这就叫做闭合子图.每个点都有一个权 ...

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

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

  9. [WC2008]游览计划 解题报告

    [WC2008]游览计划 斯坦纳树板子题,其实就是状压dp 令\(dp_{i,s}\)表示任意点\(i\)联通关键点集合\(s\)的最小代价 然后有转移 \[ dp_{i,S}=\min_{T\in ...

随机推荐

  1. C++获取单链表的倒数第k个节点

    /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ c ...

  2. Android学习之基础知识五—Android常用的七大控件

    一.TextView控件:在界面上显示一段文本信息 先看XML代码和执行效果:         代码分析: 1.android:id属性,给当前控件定义了一个唯一的标识符 2.android:layo ...

  3. blob 对象 实现分片上传 及 显示进度条

    blob对象介绍 一个 Blob对象表示一个不可变的, 原始数据的类似文件对象.Blob表示的数据不一定是一个JavaScript原生格式 blob对象本质上是js中的一个对象,里面可以储存大量的二进 ...

  4. 重装系统之制作U盘启动盘

    准备: 1.需要一个大于4G的U盘. 2.一个原版系统. 3.制作U盘启动盘的工具—ultraliso. 一.一个大于4G的U盘 制作启动盘将会格式化U盘,记得做好备份. 二.一个原版系统 至于你要装 ...

  5. fastjson tojson部分规则

    fastjson 作为java 目前最快速,最轻便  json对象,与json 字符串转换 第三方包,阿里巴巴提供. 对象转json规则 转json字符串 列 JSONObject.toJSON(ne ...

  6. Luogu P2059 [JLOI2013]卡牌游戏

    一道比较简单的概率DP 首先看到这种题目和数据范围,就要毫不犹豫地列DP方程: 我们令\(f_{i,j}\)表示还剩下i个人时编号为j的人的胜率,那么首先我们可以知道边界条件\(f_{1,1}=1\) ...

  7. 【强化学习】python 实现 saras 例一

    本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10146554.html 说明:将之前 q-learning 实现的例一,用 saras 重新 ...

  8. .NET持续集成与自动化部署之路第三篇——测试环境到生产环境的一键部署策略(Windows)

    Jenkins测试环境到生产环境的一键部署策略(Windows) 一.前言     前面我们已经初步实现了开发集成环境.测试环境的持续集成(自动化构建.自动化测试.自动化部署).但生产环境自动化部署迟 ...

  9. Python基础(上)

    前言 正式开始Python之旅,主要学习内容专注在爬虫和人工智能领域,如Web开发之类将跳过不研究. Python的意思是蟒蛇,源于作者Guido van Rossum(龟叔)喜欢的一部电视剧.所以现 ...

  10. SpringMVC环境搭建——HelloWorld

    1.新建Maven Web 工程: 2.添加相关的依赖包(Spring MVC.tomcat插件等),具体的pom.xml文件如下 <project xmlns="http://mav ...