AC日记——[Wc2008]游览计划 bzoj 2595
思路:
状压DP+spfa转移+dfs输出路径;
或者,斯坦纳树算法模板;
来,上代码:
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define INF 0x7ffffff struct NodeType {
int x,y,s;
};
struct NodeType pre[][][]; const int dx[]={,-,,,};
const int dy[]={,,,,-}; int n,m,map[][],num,bi[],all,dp[][][],ans; bool if_[][],cho[][]; queue<NodeType>que; inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} void read()
{
in(n),in(m),bi[]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
in(map[i][j]);
if(!map[i][j]) num++;
}
}
for(int i=;i<=num;i++) bi[i]=bi[i-]<<;
all=bi[num]-;
} void spfa(int f)
{
while(!que.empty())
{
NodeType now=que.front();que.pop(),if_[now.x][now.y]=false;
for(int i=;i<=;i++)
{
int x=now.x+dx[i],y=now.y+dy[i];
if(x>&&x<=n&&y>&&y<=m)
{
if(dp[x][y][f]>dp[now.x][now.y][f]+map[x][y])
{
dp[x][y][f]=dp[now.x][now.y][f]+map[x][y];
pre[x][y][f]=(NodeType){now.x,now.y,now.s};
if(!if_[x][y]) que.push((NodeType){x,y,f}),if_[x][y]=true;
}
}
}
}
} void dfs(int x,int y,int s)
{
if(x>INF||pre[x][y][s].s==) return ;
cho[x][y]=true;
dfs(pre[x][y][s].x,pre[x][y][s].y,pre[x][y][s].s);
if(x==pre[x][y][s].x&&y==pre[x][y][s].y) dfs(x,y,s-pre[x][y][s].s);
} void solve()
{
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
for(int v=;v<=all;v++) dp[i][j][v]=INF;
}
}
int F=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(!map[i][j]) dp[i][j][bi[F++]]=;
}
}
for(int S=;S<=all;S++)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
for(int s=S&(S-);s;s=S&(s-))
{
int tmp=dp[i][j][s]+dp[i][j][S-s]-map[i][j];
if(tmp<dp[i][j][S])
{
dp[i][j][S]=tmp;
pre[i][j][S]=(NodeType){i,j,s};
}
}
if(dp[i][j][S]<INF) que.push((NodeType){i,j,S}),if_[i][j]=true;
}
}
spfa(S);
}
int ex,ey;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(!map[i][j])
{
ex=i,ey=j,ans=dp[i][j][all];
break;
}
}
}
dfs(ex,ey,all);
} void print()
{
printf("%d\n",ans);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(!map[i][j]) putchar('x');
else if(cho[i][j]) putchar('o');
else putchar('_');
}
putchar('\n');
}
} int main()
{
read();
solve();
print();
return ;
}
AC日记——[Wc2008]游览计划 bzoj 2595的更多相关文章
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1572 Solved: 7 ...
- 【LG4294】[WC2008]游览计划
[LG4294][WC2008]游览计划 题面 洛谷 bzoj 题解 斯坦纳树板子题. 斯坦纳树的总结先留个坑. 代码 #include <iostream> #include <c ...
- BZOJ_2595_[Wc2008]游览计划_斯坦纳树
BZOJ_2595_[Wc2008]游览计划_斯坦纳树 题意: 分析: 斯坦纳树裸题,有几个需要注意的地方 给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值 方案记录比较麻烦,两 ...
- [WC2008]游览计划 解题报告
[WC2008]游览计划 斯坦纳树板子题,其实就是状压dp 令\(dp_{i,s}\)表示任意点\(i\)联通关键点集合\(s\)的最小代价 然后有转移 \[ dp_{i,S}=\min_{T\in ...
- bzoj2595 / P4294 [WC2008]游览计划
P4294 [WC2008]游览计划 斯坦纳树 斯坦纳树,是一种神奇的树.它支持在一个连通图上求包含若干个选定点的最小生成树. 前置算法:spfa+状压dp+dfs(大雾) 我们设$f[o][P]$为 ...
- 【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$为根的最小代 ...
随机推荐
- DbVisualizer 解决中文乱码问题
在SQL Commander中,sql语句中如果有中文,显示是‘口口口’. 解决办法如下: 在Tools->tool Properties->General->Appearance- ...
- 二分查找iOS
二分查找(也称折半查找)是很常见的一种在数组中查找数据的算法,作为一名程序员是应该必须会的.它的基础思想:获取数组的中间值,将数组分割成两份,利用查找的值跟中间值进行比较,如果查找的值大于中间值,就在 ...
- 编译Code::Blocks源码 with MinGW on Win
Build Code::Blocks源码 ---By 狂徒归来 CodeBlocks是一款非常优秀的IDE !可惜的是没有64位的版本,而且本来是轻量级别的IDE就应该够轻,能够像记事本工具一样,迅速 ...
- docker 踩坑笔记之 psql: could not connect to server
最近在用docker跑rails,也遇到了一些坑,这里记录一下. 首先build项目: docker-compose build 然后就开始报错了: psql: could not connect t ...
- Fomo3D代码分析以及漏洞攻击演示
Fomo3D过去的一周内赚足了噱头,一场光明正大的"庞氏"游戏疯狂吸金,在链得得此前的报道中提到"Fomo3D的开发者,是对生态有深刻理解的现实主义者.Fomo3D鼓励黑 ...
- java实现远程开机
import java.io.IOException; import java.net.*;public class 远程开机 { public static void main(String[] a ...
- 【bzoj2079】[Poi2010]Guilds 构造结论题
题目描述 Zy皇帝面临一个严峻的问题,两个互相抵触的贸易团体,YYD工会和FSR工会,他们在同一时间请求在王国各个城市开办自己的办事处.这里有n个城市,其中有一些以双向马路相连,这两个工会要求每个城市 ...
- [SDOI2015][bzoj3990] 序列 [搜索]
题面 传送门 思路 首先,这道题目有一个非常显然(但是我不会严格证明,只能意会一下)的结论:一个合法的操作序列中,任意两个操作是可以互换的 那么,这个结论加上本题极小的数据范围,为什么不搜索一下呢? ...
- 莫队算法初识~~CodeForces - 617E
E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...
- freemarker的简单入门程序
本文主要介绍了freemarker的常用标签<#list> <#import> <#assign> <#if> <#else> &l ...