【BZOJ】【2595】【WC2008】游览计划
Orz zky神犇http://blog.csdn.net/iamzky/article/details/42029921
spfa的灵活应用!(好像是求了一个叫做斯坦纳树的东西……)
o(︶︿︶)o 唉我就是太水了,离散化写跪了,x*1e5+y*1e4+k,但是这题里我x和y的范围是[1,10]所以在y==10的时候会出错!!
//BZOJ 2595
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std;
const int N=,INF=~0u>>;
const int fx[]={,,-,},
fy[]={,,,-};
typedef long long LL;
//#define debug
int n,m,a[N][N],d[N][N],cnt=;
int f[N][N][],pre[N][N][];
bool vis[N][N]; struct node{ int x,y; };
queue<node>Q;
inline int pack(int x,int y,int s){
return x*+y*+s;
} void spfa(int Set){
while(!Q.empty()){
int x=Q.front().x,y=Q.front().y; Q.pop();
vis[x][y]=;
rep(i,){
int tx=x+fx[i],ty=y+fy[i];
if (tx< || ty< || tx>n || ty>m) continue; if (f[tx][ty][Set]>f[x][y][Set]+a[tx][ty]){
f[tx][ty][Set]=f[x][y][Set]+a[tx][ty];
pre[tx][ty][Set]=pack(x,y,Set);
if (!vis[tx][ty]) Q.push((node){tx,ty}),vis[tx][ty]=;
}
}
}
} void dfs(int i,int j,int Set){
if (pre[i][j][Set]==INF || pre[i][j][Set]%==)return;
vis[i][j]=;
int x=pre[i][j][Set]/,
y=(pre[i][j][Set]-x*)/,
z=(pre[i][j][Set]-x*-y*);
#ifdef debug
printf("%d,%d,%d----->%d,%d,%d\n",x,y,z,i,j,Set);
#endif
dfs(x,y,z);
if (x==i && y==j) dfs(i,j,Set-z);
} void solve(){
for(int Set=;Set<(<<cnt);Set++){
F(x,,n) F(y,,m){
for(int s=Set&(Set-);s;s=(s-)&Set){
if(f[x][y][Set]>f[x][y][s]+f[x][y][Set-s]-a[x][y]){
f[x][y][Set]=f[x][y][s]+f[x][y][Set-s]-a[x][y];
pre[x][y][Set]=pack(x,y,s);
}
}
if (f[x][y][Set]!=INF){Q.push((node){x,y}); vis[x][y]=;}
}
spfa(Set);
}
int x,y;
F(i,,n) F(j,,m) if (!a[i][j]) {x=i; y=j;break;}
printf("%d\n",f[x][y][(<<cnt)-]); #ifdef debug
F(i,,n) F(j,,m)
F(k,,(<<cnt)-)
if (pre[i][j][k]!=INF)
printf("pre[%d][%d][%d]=%d\n",i,j,k,pre[i][j][k]);
#endif
dfs(x,y,(<<cnt)-);
F(i,,n) F(j,,m){
if (!a[i][j]) putchar('x');
else if(vis[i][j]) putchar('o');
else putchar('_');
if (j==m) puts("");
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("file.in","r",stdin);
// freopen("file.out","w",stdout);
#endif
scanf("%d%d",&n,&m);
F(i,,) F(j,,)
F(k,,(<<)) f[i][j][k]=pre[i][j][k]=INF;
F(i,,n)
F(j,,m){
scanf("%d",&a[i][j]);
if (!a[i][j])
f[i][j][<<(cnt++)]=;
}
solve();
return ;
}
【BZOJ】【2595】【WC2008】游览计划的更多相关文章
- bzoj 2595 [Wc2008]游览计划(斯坦纳树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2595 [题意] 给定N*M的长方形,选最少权值和的格子使得要求的K个点连通. [科普] ...
- bzoj:2595: [Wc2008]游览计划
Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点:否则表示控制该方块至少需要的志愿者数 ...
- BZOJ 2595: [Wc2008]游览计划 [DP 状压 斯坦纳树 spfa]【学习笔记】
传送门 题意:略 论文 <SPFA算法的优化及应用> http://www.cnblogs.com/lazycal/p/bzoj-2595.html 本题的核心就是求斯坦纳树: Stein ...
- BZOJ.2595.[WC2008]游览计划(DP 斯坦纳树)
题目链接 f[i][s]表示以i为根节点,当前关键点的连通状态为s(每个点是否已与i连通)时的最优解.i是枚举得到的根节点,有了根节点就容易DP了. 那么i为根节点时,其状态s的更新为 \(f[i][ ...
- BZOJ 2595 [Wc2008]游览计划 ——斯坦纳树
[题目分析] 斯坦纳树=子集DP+SPFA? 用来学习斯坦纳树的模板. 大概就是用二进制来表示树包含的点,然后用跟几点表示树的形态. 更新分为两种,一种是合并两个子集,一种是换根,换根用SPFA迭代即 ...
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1572 Solved: 7 ...
- 【BZOJ】2595: [Wc2008]游览计划
题意 \(n * m\)的网格,如果\(a_{i, j} = 0\)则表示景点,否则表示这里的需要的志愿者人数.求一种安排志愿者的方案使得所有景点连通且志愿者最少. 分析 本题可以插头dp,然而有一个 ...
- 【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 ...
随机推荐
- 华为荣耀V8这个7.0的系统的root
原文链接:http://m.shuaji.com/jiaocheng/5585.htm 已经有不少的机友的华为荣耀V8手机已经升级到EMUI5.0了,也就是现在的安卓7.0的系统,那这个时候该如何进行 ...
- Revit二次开发示例:AutoStamp
该示例中,在Revit启动时添加打印事件,在打印时向模型添加水印,打印完成后删除该水印. #region Namespaces using System; using System.Collect ...
- BZOJ 1951SDOI2010 古代猪文
真是到很强的数学题 先利用欧拉定理A^B %p=A^(B%φ(p)+φ(p) ) %p 然后利用卢卡斯定理求出在modφ(p)的几个约数下的解 再利用中国剩余定理合并 计算答案即可 By:大奕哥 #i ...
- BZOJ2111 ZJOI2010排列计数
根据Pi>Pi/2可以看出来这是一个二叉树 所以我们可以用树形DP的思想 f[i]=f[i<<1]*f[i<<1|1]*C(s[i]-1,s[i<<1]),s ...
- Educational Codeforces Round 45 (Div 2) (A~G)
目录 Codeforces 990 A.Commentary Boxes B.Micro-World C.Bracket Sequences Concatenation Problem D.Graph ...
- php 安全模式限制函数
表 42-2. 安全模式限制函数 函数名 限制 dbmopen() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者). dbase_open() 检查被操作的文件或目录是否与正在执 ...
- java 中常用的类
java 中常用的类 Math Math 类,包含用于执行基本数学运算的方法 常用API 取整 l static double abs(double a) 获取double 的绝对值 l sta ...
- 【BZOJ】4260: Codechef REBXOR【Trie树】【前后缀异或最大】
4260: Codechef REBXOR Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2218 Solved: 962[Submit][Stat ...
- DHT(Distributed Hash Table,分布式哈希表)
DHT(Distributed Hash Table,分布式哈希表)类似Tracker的根据种子特征码返回种子信息的网络. DHT全称叫分布式哈希表(Distributed Hash Table),是 ...
- hdu 4647 Another Graph Game,想到了就是水题了。。
题目是给一个无向图,其中每个节点都有点权,边也有边权,然后就有2个小朋友开始做游戏了ALICE &BOB 游戏规定ALICE 先行动然后是BOB,然后依次轮流行动,行动时可以任意选取一个节点并 ...