[BZOJ2595]游览计划】的更多相关文章

斯坦纳树居然不是数据结构... 斯坦纳树应该是类似最小生成树的问题,只不过它允许增加额外的点 比如这道题就是找关于景点的最小生成树,但还要付出最小的代价,加一些额外的格子把景点都连起来 套路是设$f_{s,i}$表示至少选$s$这个集合的点,必经$i$的最小价值,那么转移就是$f_{s,i}\gets f_{u,i}+f_{s-u,i}-v_i(u\subset s)$和$f_{s,i}\gets f_{s,j}+w_{i,j}\left(\exists(i,j)\right)$ 如果$f_{u…
BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j,k}\)表示经过点(i,j)且现在连通性为\(k\)的最小费用. 有两种转移方程: \(dp_{i,j,k}=dp_{i,j,s}+dp_{i,j,k-s}-a[i][j];\) \(dp_{i,j,k}=dp_{x,y,k}+a[i][j]\) 这个还是比较显然? 发现后面那个东西很像最短路不是吗…
[BZOJ2595][Wc2008]游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点:否则表示控制该方块至少需要的志愿者数目. 相邻的整数用 (若干个) 空格隔开,行首行末也可能有多余的空格. Output 由 N + 1行组成.第一行为一个整数,表示你所给出的方案中安排的志愿者总数目. 接下来 N行,每行M 个字符,描述方案中相应方块的情况: z  ‘_’(下划线)表示该…
BZOJ2595 Wc2008 游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点: 否则表示控制该方块至少需要的志愿者数目. 相邻的整数用 (若干个) 空格隔开, 行首行末也可能有多余的空格. Output 由 N + 1行组成.第一行为一个整数,表示你所给出的方案中安排的志愿者总数目. 接下来 N行,每行M 个字符,描述方案中相应方块的情况: z ‘_’(下划线)表示该方…
游览计划 bzoj-2595 wc-2008 题目大意:题目链接.题目连接. 注释:略. 想法:裸题求斯坦纳树. 斯坦纳树有两种转移方式,设$f[s][i]$表示联通状态为$s$,以$i$为根的最小代价. 第一个转移就是$f[s][i]=f[t][i]+f[s-t][i]$.这个显然但是是针对边权的,这个题我们需要减掉多算的点权更新答案. 第二个转移是相同的$s$,即$f[s][i]=f[s][j]+E[i][j]$. 发现很像三角形不等式,用$spfa$转移即可. 代码2595: #inclu…
P4294 [WC2008]游览计划 斯坦纳树 斯坦纳树,是一种神奇的树.它支持在一个连通图上求包含若干个选定点的最小生成树. 前置算法:spfa+状压dp+dfs(大雾) 我们设$f[o][P]$为第$o$个点上状态为$P$的最小代价,其中状态使用二进制存储已经连接了多少个选定点. 初始化:显然对于每个选定点,$f[o][1<<k]=0$,$k$为该选定点在所有选定点中的编号.其他为$inf$ 蓝后就是将状态从小到大枚举进行递推 $for(P=0;P<(1<<k);++P)…
2595: [Wc2008]游览计划 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1518  Solved: 714[Submit][Status][Discuss] Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点:否则表示控制该方块至少需要的志愿者数目. 相邻的整数用 (若干个) 空格隔开,行…
BZOJ_2595_[Wc2008]游览计划_斯坦纳树 题意: 分析: 斯坦纳树裸题,有几个需要注意的地方 给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值 方案记录比较麻烦,两边的转移都需要记录,最后dfs找方案会比较容易理解 代码: #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> using namespace std; #de…
[WC2008]游览计划 斯坦纳树板子题,其实就是状压dp 令\(dp_{i,s}\)表示任意点\(i\)联通关键点集合\(s\)的最小代价 然后有转移 \[ dp_{i,S}=\min_{T\in S}dp_{i,S}+dp_{i,S \ xor\ T}-cost_i \] 这是自己转移自己 \[ dp_{u,S}=\min_{(u,v)\in E}dp_{v,S}+cost_u \] 这是从别人转移 我们按\(S\)分层去做,注意到别人转移是无后效性的,但长的像松弛,直接跑spfa就可以了…
[LG4294][WC2008]游览计划 题面 洛谷 bzoj 题解 斯坦纳树板子题. 斯坦纳树的总结先留个坑. 代码 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <queue> using namespace std; i…
2595: [Wc2008]游览计划 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1572  Solved: 739 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点:否则表示控制该方块至少需要的志愿者数目. 相邻的整数用 (若干个) 空格隔开,行首行末也可能有多余的空格. Output 由 N…
LINK:游览计划 斯坦纳树例题. 斯坦纳树是这样一类问题:带权无向图上有K个关键点 求出包含这K个点的最小生成树. 也就是说 求最小生成树 但是 并不是整张图 仅限于K个点. 可以发现我们利用克鲁斯卡尔或者prim算法 求的都是整张图的最小生成树. 所以可以发现 这个斯坦纳树问题 其实是一个np困难问题 不存在多项式的时间复杂度. 可以考虑搜索或者状压了. 这道题共有100个点 其中有10个关键点 我们首选状压dp. 有状态 f[i][j][k]表示到了(i,j)这个点了 所经过的点集为k的最…
题意:见题面(我发现自己真是越来越懒了) 有N*M的矩阵,每个格子有一个值a[i,j] 现要求将其中的K个点(称为关键点)用格子连接起来,取(i,j)的费用就是a[i,j] 求K点全部连通的最小花费以及方案 n,m,k<=10 思路:斯坦纳树 虽然去年就疑似过了一道裸题,不过估计也是COPY的std,早就忘干净了 先%了一发论文,看到了几道有意思的SPFA的应用,准备去做一下 设dp[i,j,sta]为当前在(i,j),关键点联通情况为sta的最小花费 显然初始化 \[ dp[i,j,1<&l…
斯坦纳树板子题. 考虑状压dp,设f[i][j][S]表示当前在点(i,j)考虑转移,其所在的联通块包含的关键点集(至少)为S的答案. 转移时首先枚举子集,有f[i][j][S]=min{f[i][j][x]+f[i][j][y]-a[i][j]} (x&y=0,x|y=S). 然后考虑从点(i,j)从哪拓展而来,有f[i][j][S]=min{f[x][y][S]}+a[i][j],其中(x,y)为(i,j)的相邻点,使用spfa转移. 这里第二种转移仅在相同关键点集下进行,因为由更小点集转移…
题目链接 BZOJ2595 题解 著名的斯坦纳树问题 设\(f[i][j][s]\)表示点\((i,j)\)与景点联通状况为\(s\)的最小志愿者数 设\(val[i][j]\)为\((i,j)\)需要的志愿者数 有两种转移 一种是自己转移 \[f[i][j][s] = min\{f[i][j][e] + f[i][j][\complement_s e] - val[i][j]\}\] 一种是由周围转移过来 \[f[i][j][s] = min\{f[i][j][s] + f[x][y][s]…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2595 今天刚学了斯坦纳树,还不太会,写一道题练习一下: 参考了博客:http://www.cnblogs.com/lazycal/archive/2013/08/31/bzoj-2595.html 代码也是模仿着写的,感觉有了更深的理解: 总之,大概就是两种转移方式,合并转移枚举子集即可,最短路转移用 spfa: 还要记录一个 pre 用来找到连通块内的点: 用哈希一样的方法把几个数 pa…
Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点:否则表示控制该方块至少需要的志愿者数目. 相邻的整数用 (若干个) 空格隔开,行首行末也可能有多余的空格. Output 由 N + 1行组成.第一行为一个整数,表示你所给出的方案中安排的志愿者总数目. 接下来 N行,每行M 个字符,描述方案中相应方块的情况: z  '_'(下划线)表示该方块没有安排志愿者: z  'o'(小写英文字…
话说挺早就写过斯坦纳树了,不过当时没怎么总结,也不是很理解……现在来个小结吧~ 斯坦纳树就是包含给定点的最小生成树(个人理解权值应当为正). 一般来讲,给定点的数目应该很小吧...于是我们可以用状压DP来解决. 需要2个方程: f[st][i]表示连通性至少为st,且经过i点的最小距离 方程1.f[st][i] = Min{f[s][i] + f[st - s][i]}(s为st的子集) 方程2.f[st][i] = Min{f[st][j] + w(i,j)}(i,j之间有边相连) 这里大家可…
斯坦纳树是在一个图中选取某些特定点使其联通(可以选取额外的点),要求花费最小,最小生成树是斯坦纳树的一种特殊情况 我们用dp[i][j]来表示以i为根,和j状态是否和i联通,那么有 转移方程: dp[i][j]=min(dp[i][s]+dp[j-s]-a[i][j]) (表示有两个状态s和j-s都和i联通,我们把这两个状态联通起来,这样多算了一次a[i][j],减去即可) dp[i][j]=min(dp[i][j],dp[k][j]+a[i][k]) (如果i和k连着,那么,链接i和k,更新d…
Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 2030  Solved: 986[Submit][Status][Discuss] Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点:否则表示控制该方块至少需要的志愿者数目. 相邻的整数用 (若干个) 空格隔开,行首行末也可能有多余的空格. Outpu…
http://www.lydsy.com/JudgeOnline/problem.php?id=2595 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点: 否则表示控制该方块至少需要的志愿者数目. 相邻的整数用 (若干个) 空格隔开, 行首行末也可能有多余的空格. Output 由 N + 1行组成.第一行为一个整数,表示你所给出的方案 中安排的志愿者总数目. 接下来 N行,每行M…
传送门 题意:略 论文 <SPFA算法的优化及应用> http://www.cnblogs.com/lazycal/p/bzoj-2595.html 本题的核心就是求斯坦纳树: Steiner Tree: Given an undirected graph with non-negative edge weights and a subset of vertices, usually referred to as terminals, the Steiner tree problem in g…
[题目描述] 从未来过绍兴的小 D 有幸参加了Winter Camp 2008,他被这座历史名城的秀丽风景所吸引,强烈要求游览绍兴及其周边的所有景点. 主办者将绍兴划分为 N 行M 列(N×M)个方块,如下图(8×8) 景点含于方块内,且一个方块至多有一个景点.无景点的方块视为路. 为了保证安全与便利,主办方依据路况和治安状况,在非景点的一些方块内安排不同数量的志愿者:在景点内聘请导游(导游不是志愿者).在选择旅游方案时,保证任意两个景点之间,存在一条路径,在这条路径所经过的每一个方块都有志愿者…
目录 @description@ @solution@ @accepted code@ @details@ @description@ 从未来过绍兴的小D有幸参加了Winter Camp 2008,他被这座历史名城的秀从未来过绍兴的小D有幸参加了Winter Camp 2008,他被这座历史名城的秀丽风景所吸引,强烈要求游览绍兴及其周边的所有景点. 主办者将绍兴划分为N行M列(NXM)个方块,景点含于方块内,且一个方块至多有一个景点.无景点的方块视为路. 为了保证安全与便利,主办方依据路况和治安…
http://www.lydsy.com/JudgeOnline/problem.php?id=2595 斯坦纳树的例题诶...我怎么做了好长时间_(:з」∠)_ 首先这是一棵树. 状压表示状态,\(f(i,j,s)\)表示连通的景点的状态为s,i和j为树根的最小值. 转移时先在当前状态s上枚举s的子集t,用子集来转移\(f(i,j,s)=min\{f(i,j,t)+f(i,j,\complement_st)-a(i,j)\},t\varsubsetneqq s,t\neq\varnothing…
题意 \(n * m\)的网格,如果\(a_{i, j} = 0\)则表示景点,否则表示这里的需要的志愿者人数.求一种安排志愿者的方案使得所有景点连通且志愿者最少. 分析 本题可以插头dp,然而有一个东西叫斯坦纳树,来学习学习. 令\(f(i, j, s)\)表示\((i, j)\)为根,连通性为\(s\)的最少志愿者.则有转移: $$f(i, j, s) = min\begin{cases}f(i, j, t) + f(i, j, s-t) - a_{i, j} & t \neq \varno…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2595 [题意] 给定N*M的长方形,选最少权值和的格子使得要求的K个点连通. [科普] “斯坦纳树”就是包含给定点的最小生成树. [思路] 那么本题就是求一棵斯坦纳树. 设f[i][j][S]表示在点(i,j)且与之相连的点的状态为S. 有两种转移: f[i][j][S]<-f[i][j][S’]+f[i][j][S-S’]-a[i][j],合并子集 f[i][j][S]<-f[i…
Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点:否则表示控制该方块至少需要的志愿者数目. 相邻的整数用 (若干个) 空格隔开,行首行末也可能有多余的空格. Output 由 N + 1行组成.第一行为一个整数,表示你所给出的方案中安排的志愿者总数目. 接下来 N行,每行M 个字符,描述方案中相应方块的情况: z  ‘_’(下划线)表示该方块没有安排志愿者: z  ‘o’(小写英文字…
题面太鬼畜不粘了. 题意就是给一张n*m的网格图,每个点有点权,有k个关键点,让你把这k个关键点连成一个联通快的最小代价. 题解 这题nmk都非常小,解法肯定是状压,比较一般的解法插头dp,但不太好写. 但其实这道题是裸的斯坦纳树模型. 斯坦纳树是最小生成树的变形,在一般情况下是NP问题,但在k规模较少时可以用状压dp求解. 我们可以设dp[i][j][s]表示以(i,j)为根,覆盖关键点集合为s时的最小代价. 对于这个状态内部的更新,我们可以对s枚举子集,相当于把联通块拆成两部分再合并起来,d…
题目链接 不是很会呢,但似乎抄了题解后有点明白了 sol:状态DP显然,其实是要构建一棵最小生成树一样的东西,我自己的理解(可能不是很对哦希望多多指教)f[x][y][zt]就是到x,y这个点,状态为zt,时的最小代价于是有两种转移方法:一种是若zt1|zt2=zt且zt1&zt2==0,那么f[x][y][zt]=min(f[x][y][zt],f[x][y][zt1]+f[x][y][zt2]),第二种就是跑spfa,如x1,y1和x,y联通,f[x1][y1][zt''']=min(f[x…