BZOJ 2595 斯坦那树
很久以前就想做,后来弃坑了。
最近又在群里有人问了类似的问题,艾老师说是斯坦纳树(%%%)
就是状压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 斯坦那树的更多相关文章
- bzoj 2595 斯坦纳树
题目大意: 选定一些格子保证景点对应的格子通过这些格子连通,保证选定的所有格子对应的权值和最小 这是相当于理解为将所有点形成的最小生成树 这里点的个数很少,所以可以对每一个点进行状态压缩 f[st][ ...
- 【BZOJ 2595】【WC 2008】游览计划
http://www.lydsy.com/JudgeOnline/problem.php?id=2595 斯坦纳树的例题诶...我怎么做了好长时间_(:з」∠)_ 首先这是一棵树. 状压表示状态,\( ...
- bzoj 2595 [Wc2008]游览计划(斯坦纳树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2595 [题意] 给定N*M的长方形,选最少权值和的格子使得要求的K个点连通. [科普] ...
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1572 Solved: 7 ...
- BZOJ 2595: [Wc2008]游览计划 [DP 状压 斯坦纳树 spfa]【学习笔记】
传送门 题意:略 论文 <SPFA算法的优化及应用> http://www.cnblogs.com/lazycal/p/bzoj-2595.html 本题的核心就是求斯坦纳树: Stein ...
- BZOJ 2595 [Wc2008]游览计划 ——斯坦纳树
[题目分析] 斯坦纳树=子集DP+SPFA? 用来学习斯坦纳树的模板. 大概就是用二进制来表示树包含的点,然后用跟几点表示树的形态. 更新分为两种,一种是合并两个子集,一种是换根,换根用SPFA迭代即 ...
- BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)
题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...
- bzoj 4006 [JLOI2015]管道连接(斯坦纳树+状压DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4006 [题意] 给定n点m边的图,连接边(u,v)需要花费w,问满足使k个点中同颜色的 ...
- bzoj 4006 管道连接 —— 斯坦纳树+状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...
随机推荐
- mysql之常用操作
1. 数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数 ...
- web.xml配置详情 - 简要介绍
<!--web.xml 元素简介--> <?xml version="1.0" encoding="UTF-8"?><web-ap ...
- FreeMarker常用语法
转自:http://www.cnblogs.com/linjiqin/p/3388298.html FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{exp ...
- Lucas定理
Lucas' theorem In number theory, Lucas's theorem expresses the remainder of division of the binomial ...
- 深入浅出设计模式——外观模式(Facade Pattern)
模式动机引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度. 模式定义外观模式(Facade Pattern):外部与一个子系统的通信必 ...
- 《BI那点儿事》数据流转换——字词查找转换
字词查找转换将从转换输入列的文本中提取的字词与引用表中的字词进行匹配,然后计算出查找表中的字词在输入数据集中出现的次数,并将计数与引用表中的此字词一并写入转换输出的列中.此转换对于创建基于输入文本并带 ...
- 使用File类递归列出E盘下全部文件
import java.io.File;public class FileListTest { public void tree(File file){ if(file.listFiles()!=nu ...
- null和undefined
null表示"没有对象",即该处不应该有值.典型用法是: (1) 作为函数的参数,表示该函数的参数不是对象. (2) 作为对象原型链的终点. undefined表示"缺少 ...
- Xshell 登录 AWS CentOS 出现“所选择的用户秘钥未在远程主机上注册“,最终解决办法!
其实就是 登录用户名错了,是 root,不是centos 也不是 ec2-user ! Xshell 连接配置界面如下 最重要是 登录授权配置 最后,登录成功! 就这么简单
- Yii 验证输入框是否输入的是数字
在对应的Model文件的rules中加入如下代码: array('age,phone', 'numerical', 'integerOnly'=>true,'message'=>'{att ...