luoguP4294 [WC2008]游览计划
题意
斯坦纳树裸题。
显然答案是棵树。
设\(f[i][s]\)表示以\(i\)为根,集合为\(s\)的最小代价。
先在同根之间转移:
\(f[i][s]=min(f[i][t]+f[i][s\ xor\ t]-val[i])\)
减\(val[i]\)是因为算了两遍。
之后扩展新点:
\(f[i][s]=min(f[j][s]+val[i]),(i,j)\)联通,这个可以用\(spfa\)。
code:
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define mkp make_pair
#define fir first
#define sec second
const int maxn=12;
const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};
int n,m,K,tot,root,ans=0x3f3f3f3f;
int id[maxn][maxn],a[maxn][maxn],f[maxn*maxn][1<<maxn];
pii pos[maxn*maxn],g[maxn*maxn][1<<maxn];
bool vis[maxn*maxn];
bool check[maxn][maxn];
vector<int>keypoints;
queue<int>q;
inline void spfa(int s)
{
while(!q.empty())
{
int x=q.front();q.pop();vis[x]=0;
for(int i=0;i<4;i++)
{
int mx=pos[x].fir+dx[i],my=pos[x].sec+dy[i];
if(mx<1||mx>n||my<1||my>m)continue;
int y=id[mx][my];
if(f[y][s]>f[x][s]+a[pos[y].fir][pos[y].sec])
{
f[y][s]=f[x][s]+a[pos[y].fir][pos[y].sec];
if(!vis[y])vis[y]=1,q.push(y);
g[y][s]=mkp(x,s);
}
}
}
}
void dfs(int now,int s)
{
if(!g[now][s].sec)return;
check[pos[now].fir][pos[now].sec]=1;
if(g[now][s].fir==now)dfs(now,s^g[now][s].sec);
dfs(g[now][s].fir,g[now][s].sec);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]),id[i][j]=++tot,pos[tot]=mkp(i,j);
memset(f,0x3f,sizeof(f));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(!a[i][j])f[id[i][j]][1<<K]=0,K++,keypoints.push_back(id[i][j]);
for(int s=1;s<(1<<K);s++)
{
for(int i=1;i<=n*m;i++)
{
for(int t=s&(s-1);t;t=(t-1)&s)
if(f[i][s]>f[i][s^t]+f[i][t]-a[pos[i].fir][pos[i].sec])
{
f[i][s]=f[i][s^t]+f[i][t]-a[pos[i].fir][pos[i].sec];
g[i][s]=mkp(i,t);
}
if(f[i][s]<0x3f3f3f3f)q.push(i),vis[i]=1;
}
spfa(s);
}
for(unsigned int i=0;i<keypoints.size();i++)
if(ans>f[keypoints[i]][(1<<K)-1])ans=f[keypoints[i]][(1<<K)-1],root=keypoints[i];
printf("%d\n",ans);
dfs(root,(1<<K)-1);
for(int i=1;i<=n;i++,puts(""))
for(int j=1;j<=m;j++)
if(!a[i][j])putchar('x');
else putchar(check[i][j]?'o':'_');
return 0;
}
luoguP4294 [WC2008]游览计划的更多相关文章
- 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, 则该方块为 ...
- 【LG4294】[WC2008]游览计划
[LG4294][WC2008]游览计划 题面 洛谷 bzoj 题解 斯坦纳树板子题. 斯坦纳树的总结先留个坑. 代码 #include <iostream> #include <c ...
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1572 Solved: 7 ...
- 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$为根的最小代 ...
随机推荐
- go 通过select实现超时
package main import ( "fmt" "time" ) func main() { ch := make(chan int) quit := ...
- systemdump相关
/vendor/sprd/open-source/tools/crashcat sysdump.core.* > dump.bincrash -m phys_base=0x80000000 du ...
- node启动服务后,窗口不能关闭。pm2了解一下
在做项目时,遇到一个问题. 项目中要和一个3D模型做交互,而做模型的人,给了一个 js 文件.需要在node环境下,使用vscode调试功能启动的. 而我们使用或者调试的时候,喜欢使用命令咋办? 使用 ...
- JVM内存溢出分析java.lang.OutOfMemoryError: Java heap space
JVM内存溢出查询java.lang.OutOfMemoryError: Java heap space查出具体原因分为几个预备步骤 1.在运行java程序是必须设置jvm -XX:+HeapDump ...
- ssh工具推荐MobaXterm 可能是你遇到过的比较出色的一款
之前一直用xshell,现在推荐一个更好用的工具. 一站式的解决你的需求,而且画风个人也比较喜欢,而且随便一百度就能找得到green PJ 的版本
- powershell与linux bash对比
转自Github/Powershell Bash PowerShell Description ls dir, Get-ChildItem List files and folders tree di ...
- 【JS】---5 JS通过事件隐藏显示元素
JS通过事件隐藏显示元素 在开发中,很多时候我们需要点击事件,才显示隐藏元素.那如何做到页面刚开始就把标签隐藏. 有两种方法: (1) display:none <div id=" ...
- Kafka Network层解析,还是有人把它说清楚了
我们知道kafka是基于TCP连接的.其并没有像很多中间件使用netty作为TCP服务器.而是自己基于Java NIO写了一套. 几个重要类 先看下Kafka Client的网络层架构. 本文主要分析 ...
- 初识Android App自动化测试框架--Unittest
1.为什么需要使用框架实现自动化测试 作为测试工程师,可能在代码能力上相比开发工程师要弱一点,所以我们在写脚本的时候就会相对容易的碰到更多的问题,如果有一个成熟的框架供给我们使用的话,可以帮助我们避免 ...
- Linux性能调优 | 01 平均负载的理解和分析
01 uptime命令 通常我们发现系统变慢时,我们都会执行top或者uptime命令,来查看当前系统的负载情况,比如像下面,我执行了uptime,系统返回的了结果. [root@lincoding ...