洛谷 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 ...
随机推荐
- Android学习之基础知识八—Android广播机制
一.广播机制简介 Android提供了一套完整的API,允许应用程序自由的发送和接受广播,发送广播借助于我们之前学过的:Intent,而接收广播需要借助于广播接收器(Broadcast Receive ...
- 如何扩展32位EXE程序的使用内存
1 运行Visual studio的命令行,执行下面命令:editbin /LARGEADDRESSAWARE “C:\Program Files\Skyline\TerraExplorer Pro\ ...
- mvn打包到私服的命令
1.mvn clean package install -Dmaven.test.skip=true deploy 2.docker清楚Nexus私服上包的命令: a) docker exec -it ...
- Luogu3760 TJOI2017 异或和 树状数组
传送门 题意:给出一个长度为$N$的非负整数序列,求其中所有连续区间的区间和的异或值.$N \leq 10^5$,所有元素之和$\leq 10^6$ 设序列的前缀和为$s_i$,特殊地,$s_0=0$ ...
- Ionic下的Jpush消息推送与内容显示
本文测试Jpush将消息推送给手机端,手机端点击通知栏,即可看到具体的推送内容. 1.极光推送消息设置 设置附加字段: 点击发送,手机端收到消息通知. 2.手机接收到的消息通知 点击之后进入具体的页面 ...
- 【强化学习】python 实现 saras lambda 例一
本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10147265.html 将例一用saras lambda算法重新撸了一遍,没有参照任何其他人 ...
- Scala学习(七)练习
控制结构和函数 1. 编写示例程序,展示为什么 package com.horstmann.impatient 不同于 package com package horstmann package im ...
- QT 遇到的问题
遇到的问题: 1:在QT中使用opengl,发现一个很神奇的问题,个人感觉是qt的bug. 问题详情:在我添加了一个成员变量之后,使用opengl编写的窗口没有任何输出了,只有一个背景. 但是删除那个 ...
- ul ol li的序号编号样式
序号样式例子,下面是html代码(做参考) <ol> <li>列表内容列表内容列表内容列表</li> <li>列表内容列表内容列表内容列表</li ...
- Chrome F12调试
F12 断点 F5 Esc 选择鼠标右击:编辑||hover样式 Sonrces go to file (ctrl+p) 搜搜文件名