很久以前就想做,后来弃坑了。

最近又在群里有人问了类似的问题,艾老师说是斯坦纳树(%%%)

就是状压DP,然后用Spfa对状态进行转移.

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int Maxn=;
const int Maxm=;
const int Inf=0x3f3f3f3f;
const int Px=;
const int Py=;
const int dx[]={,,,-};
const int dy[]={,-,,};
//==================================
int n,m,K,Sta,g[Maxn][Maxn],f[Maxn][Maxn][Maxm],pre[Maxn][Maxn][Maxm],STA[Maxn][Maxn];
bool used[],Ans[Maxn][Maxn];
queue<int> Q;
inline int Calc(int x,int y,int s) {return x*Px+y*Py+s;}
inline bool Check(int a,int b) {return (a|b)==a;}
inline bool Judge(int x,int y) {return (x>= && x<=n) && (y>= && y<=m);}
void Spfa(int sta)
{
while (!Q.empty())
{
int u=Q.front(); Q.pop();
int x=u/Px,y=u%Px/Py;
for (int d=;d<;d++)
{
int p=x+dx[d],q=y+dy[d];
int r=sta|STA[p][q];
if (!Judge(p,q)) continue;
if (f[p][q][r]>f[x][y][sta]+g[p][q])
{
f[p][q][r]=f[x][y][sta]+g[p][q];
pre[p][q][r]=u;
int k=Calc(p,q,r);
if (!used[k] && sta==r) used[k]=true,Q.push(k);
}
}
used[u]=false;
}
} void Init(int x,int y,int sta)
{
Ans[x][y]=true;
int k=pre[x][y][sta];
if (!k) return;
int i=k/Px,j=k%Px/Py,s=k%Px%Py;
Init(i,j,s);
if (i==x && j==y) Init(i,j,sta-s);
} void Out()
{
for (int i=;i<=n;i++)
{
for (int j=;j<=m;j++)
if (Ans[i][j])
if (g[i][j]) putchar('o'); else putchar('x');
else putchar('_');
putchar('\n');
}
} int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
for (int k=;k<=(<<);k++) f[i][j][k]=Inf; for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
scanf("%d",&g[i][j]);
if (!g[i][j]) STA[i][j]=(<<(K++)),f[i][j][STA[i][j]]=;
}
Sta=(<<K);
for (int sta=;sta<Sta;sta++)
{
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
for (int s=;s<sta;s++)
if (Check(sta,s))
if (f[i][j][sta]>f[i][j][s]+f[i][j][sta-s]-g[i][j])
f[i][j][sta]=f[i][j][s]+f[i][j][sta-s]-g[i][j],
pre[i][j][sta]=Calc(i,j,s);
if (f[i][j][sta]!=Inf)
Q.push(Calc(i,j,sta)),used[Calc(i,j,sta)]=true;
}
Spfa(sta);
} for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
if (!g[i][j])
{
printf("%d\n",f[i][j][Sta-]);
Init(i,j,Sta-);
Out();
return ;
}
return ;
}

C++

BZOJ 2595 斯坦那树的更多相关文章

  1. bzoj 2595 斯坦纳树

    题目大意: 选定一些格子保证景点对应的格子通过这些格子连通,保证选定的所有格子对应的权值和最小 这是相当于理解为将所有点形成的最小生成树 这里点的个数很少,所以可以对每一个点进行状态压缩 f[st][ ...

  2. 【BZOJ 2595】【WC 2008】游览计划

    http://www.lydsy.com/JudgeOnline/problem.php?id=2595 斯坦纳树的例题诶...我怎么做了好长时间_(:з」∠)_ 首先这是一棵树. 状压表示状态,\( ...

  3. bzoj 2595 [Wc2008]游览计划(斯坦纳树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2595 [题意] 给定N*M的长方形,选最少权值和的格子使得要求的K个点连通. [科普] ...

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

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

  5. BZOJ 2595: [Wc2008]游览计划 [DP 状压 斯坦纳树 spfa]【学习笔记】

    传送门 题意:略 论文 <SPFA算法的优化及应用> http://www.cnblogs.com/lazycal/p/bzoj-2595.html 本题的核心就是求斯坦纳树: Stein ...

  6. BZOJ 2595 [Wc2008]游览计划 ——斯坦纳树

    [题目分析] 斯坦纳树=子集DP+SPFA? 用来学习斯坦纳树的模板. 大概就是用二进制来表示树包含的点,然后用跟几点表示树的形态. 更新分为两种,一种是合并两个子集,一种是换根,换根用SPFA迭代即 ...

  7. BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)

    题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...

  8. bzoj 4006 [JLOI2015]管道连接(斯坦纳树+状压DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4006 [题意] 给定n点m边的图,连接边(u,v)需要花费w,问满足使k个点中同颜色的 ...

  9. bzoj 4006 管道连接 —— 斯坦纳树+状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...

随机推荐

  1. angularJS ng-grid 配置

    以下是按我的需求修改的 简单的demo  可以自己扩展 HTML: <!DOCTYPE html> <html class="no-js" ng-app=&quo ...

  2. 十六、Swing高级组件

    1.利用JTable类直接创建表格 (1)创建表格 构造方法:JTable(Object rowData,Object[] columnNames) (2)定制表格 编辑:isCellEditable ...

  3. 登录锁定状态下Win7关机技巧总结

    登录锁定状态下Win7关机技巧总结 一般在锁定状态都是有个关闭电脑的图标的.但是如果你的系统没有,那么怎么样关机呢,所谓的锁定状态通常是指电脑在登录界面,具体的实现如下,感兴趣的朋友可以参考下 现在大 ...

  4. 在mysql数据库原有字段后增加新内容

    update table set user=concat(user,$user) where xx=xxx; [注释]这个语法要求原来的字段值不能为null(可以为空字符''):

  5. 用excel绘制基因芯片热力图

    1.  首先我们通过一些方法得到了如下的数据,基于篇幅以及为了教学隐去了其他一些信息. 2. 选中表达数据,执行 开始—条件格式—色阶 选择一个合适的色阶: 3. 选择好颜色之后得到了如下结果:

  6. Java使用BigDecimal精确计算的简单公式计算器

    由于工作需要,写了一个使用BigDecimal运算的精确计算的计算器(然后发现其实比不用BigDecimal的并好不到哪里去) 只能做加减乘除 double类型的数字在千万级别的时候会转成科学计数法, ...

  7. android DevicePolicyManager实现一键锁屏

    本文章一部分资料来源于网上 1.实现一键锁屏关键是DevicePolicyManager这个类,然后使用lockNow():方法. 2.DevicePolicyManager类,可以让你的做软件获得系 ...

  8. HTTP中的摘要认证机制

    引子: 指定和服务器端交互的HTTP方法,URL地址,即其他请求信息: Method:表示http请求方法,一般使用"GET","POST". url:表示请求 ...

  9. 协程 & 用户级(内核级)线程 & 切换开销 & 协程与异步回调的差异

    今天先是看到多线程级别的内容,然后又看到协程的内容. 基本的领会是,协程是对异步回调方式的一种变换,同样是在一个线程内,协程通过主动放弃时间片交由其他协程执行来协作,故名协程. 而协程很早就有了,那时 ...

  10. webstrom使用方法

    一.设置file-settings- -color&fonts设置,字体 主体 -file and code templates模板ctrl+r 查找,替换1 双击shift 快速查找2 fi ...