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的更多相关文章

  1. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)

    2595: [Wc2008]游览计划 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1572  Solved: 7 ...

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

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

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

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

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

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

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

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

  6. 【BZOJ2595】 [Wc2008]游览计划

    BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...

  7. 【BZOJ2595】[Wc2008]游览计划 斯坦纳树

    [BZOJ2595][Wc2008]游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为 ...

  8. BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*

    BZOJ2595 Wc2008 游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个 ...

  9. [bzoj2595][WC2008]游览计划/[bzoj5180][Baltic2016]Cities_斯坦纳树

    游览计划 bzoj-2595 wc-2008 题目大意:题目链接.题目连接. 注释:略. 想法:裸题求斯坦纳树. 斯坦纳树有两种转移方式,设$f[s][i]$表示联通状态为$s$,以$i$为根的最小代 ...

随机推荐

  1. build dynamic libraries for iOS and load them at runtime

    编译了libmt.dylib, 和 test 程序调用,均正常.在xcode中显示调用正常,隐式调用则出现问题. 提示 dyld: Library not loaded. 即使存在在/usr/lib/ ...

  2. python判断mongodb--find(),find_one()返回是否为空

    conn = MongoClient('127.0.0.1', 27017)db = conn.diffcollection = db['test1']result = collection.find ...

  3. linux部署环境配置

    https://blog.csdn.net/dsczxcc/article/details/78728330

  4. eclipse进阶功法

    先选择要操作的行,在同时按shift+alt+a,会将所选中的文字括起来,鼠标会变成十字图标,按住鼠标左键,在相应输入文字的位置上下拖动,会出现一个竖杠,此时即可开始输入文字了,并且所选中行都有.

  5. 深入探讨ui框架

    深入探讨前端UI框架 1 前言 先说说这篇文章的由来 最近看riot的源码,发现它很像angular的dirty check,每个component ( tag )都保存一个expressions数组 ...

  6. sql分页汇总-摘抄自网络

    文章:几种常见SQL分页方式效率比较 个人倾向于:(2005以上版本支持 row_number()) select * from ( select row_number()over(order by ...

  7. WCF的坎坷发布之路

    背景       发布WCF服务之后,总会遇到这样活着那样的错误.再加上对IIS中的一些程序应用不太熟悉,所以解决起来比较困难.网上的解决方案特别多,但都只给出了个别一种原因.经过一个下午和一个上午的 ...

  8. Java进行身份证格式强校验(准)

    最近做了一个系统,涉及到对用户输入的身份证号进行校验,减少脏数据传入后台处理并降低企业验证成本,因此在接入层便对输入信息做格式强校验. 直接附上代码,可直接使用. package hope.ident ...

  9. hadoop生态圈列式存储系统--kudu介绍及安装配置

    介绍 Kudu 是一个针对 Apache Hadoop 平台而开发的列式存储管理器.Kudu 共享 Hadoop 生态系统应用的常见技术特性: 它在 commodity hardware(商品硬件)上 ...

  10. java算法(二) 快速排序

    快速排序是一种交换排序. 快速排序由C. A. R. Hoare在1962年提出. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数. 然后再 ...