斯坦纳

最小斯坦纳树

你离开我真会死。 提交于 2020-03-27 12:16:41
最小斯坦纳树 问题描述: 给定一个包含 \(n\) 个结点和 \(m\) 条带权边的无向连通图 \(G=(V,E)\) 。 再给定包含 \(k\) 个结点的点集 \(S\) ,选出 \(G\) 的子图 \(G'=(V',E')\) 使得: \(S\subseteq V'\) \(G′\) 为连通图; \(E′\) 中所有边的权值和最小。 你只需要求出 \(E′\) 中所有边的权值和。 分析: \(dp[i][s]\) 表示 以 i 为根的一棵树,包含集合 S 中所有点的最小代价 \(i\) 号点不一定在 \(s\) 中 \(w[i][j] + dp[j][s] -> dp[i][s]\) \(dp[i][T] + dp[i][S-T] -> dp[i][S]\quad(T \subseteq S)\) 第二类转移可以用枚举子集来转移,第一类转移是一个三角不等式,可以用 \(spfa\) 或者 \(dijkstra\) 第一类转移复杂度为 \(O(m\log m \times 2^k)\) 第二类转移复杂度为 \(O(n\times 3^n)\) ,子集枚举的时间复杂度可以用二项式定理求出 代码: const int N = 100 + 5; const int M = 1010; int n, m, k, x, y, z, tot; int head[N], ver[M], nxt

[WC2008]游览计划(斯坦纳树+输出方案)

空扰寡人 提交于 2020-03-06 03:28:53
Input 第一行有两个整数,N和 M,描述方块的数目。 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点; 否则表示控制该方块至少需要的志愿者数目。 相邻的整数用 (若干个) 空格隔开, 行首行末也可能有多余的空格。 Output 由 N + 1行组成。第一行为一个整数,表示你所给出的方案 中安排的志愿者总数目。 接下来 N行,每行M 个字符,描述方案中相应方块的情况: z ‘_’(下划线)表示该方块没有安排志愿者; z ‘o’(小写英文字母o)表示该方块安排了志愿者; z ‘x’(小写英文字母x)表示该方块是一个景点; 注:请注意输出格式要求,如果缺少某一行或者某一行的字符数目和要求不 一致(任何一行中,多余的空格都不允许出现) ,都可能导致该测试点不得分。 Sample Input 4 4 0 1 1 0 2 5 5 1 1 5 5 1 0 1 1 0 Sample Output 6 xoox ___o ___o xoox Hint 对于100%的数据,N,M,K≤10,其中K为景点的数目。输入的所有整数均在[0,2^16]的范围内 题解 显然斯坦纳树(好像也可以插头DP) 怎么输出方案呢? 记录一下每个点是从哪个点转移过来的即可 最后输出方案的时候用一个dfs,怎么转移过来的,就怎么dfs回去 (WA了一次是因为输出了大写的X

@loj - 2977@ 「THUSCH 2017」巧克力

北战南征 提交于 2020-03-05 13:54:31
目录 @description@ @solution@ @accepted code@ @details@ @description@ 「人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道。」 明明收到了一大块巧克力,里面有若干小块,排成 n 行 m 列。每一小块都有自己特别的图案 \(c_{i, j}\) ,它们有的是海星,有的是贝壳,有的是海螺……其中还有一些因为挤压,已经分辨不出是什么图案了。明明给每一小块巧克力标上了一个美味值 \(a_{i, j}\) ( \(0 \leq a_{i, j} \leq 1\) ),这个值越大,表示这一小块巧克力越美味。 ​正当明明咽了咽口水,准备享用美味时,舟舟神奇地出现了。看到舟舟恳求的目光,明明决定从中选出一些小块与舟舟一同分享。 ​舟舟希望这些被选出的巧克力是连通的(两块巧克力连通当且仅当他们有公共边),而且这些巧克力要包含至少 k( \(1 \leq k \leq 5\) )种。而那些被挤压过的巧克力则是不能被选中的。 明明想满足舟舟的愿望,但他又有点「抠」,想将美味尽可能多地留给自己。所以明明希望选出的巧克力块数能够尽可能地少。如果在选出的块数最少的前提下,美味值的中位数(我们定义 n 个数的中位数为第 \(\lfloor \frac{n + 1}{2} \rfloor\) 小的数)能够达到最小就更好了。 你能帮帮明明吗?

斯坦纳树

删除回忆录丶 提交于 2019-12-11 18:58:25
斯坦纳树 斯坦纳树大概就是指在一张无向有权图中给定若干个关键点,求出一个边权和最小的边集,使得在仅保留这个边集中的边的情况下,任意两个关键点相互之间连通。 (当然如果是点权也没有问题,因为这个算法得扩展性很强?) 就以下面这题为例讲一下求斯坦纳树吧。 题目 这就是求斯坦纳树的模板题,不过写起来因为坐标二维和数字相互转化的问题比较麻烦。 然后求斯坦纳树大概是一个NP问题,我们只能设计一个状压来解决。 设 \(f_{i,S}\) 表示以关键点 \(i\) 为根(或者说在包含关键点 \(i\) 的情况下),当前已经连通的关键点集合为 \(S\) 的最小代价。 转移分为两种: \(1.f_{i,S}=\min\limits_{t\subset s}(f_{i,t}+f_{i,s\setminus t}-a_i)\) 转移的意义非常显然就不说了, \(-a_i\) 是因为 \(i\) 这个点会被重复算两次。 如果是边权代价的话可以把 \(-a_i\) 去掉。 \(2.f_{i,S}=\min\limits_{\exists (i,j)\in E}(f_{j,S}+a_i)\) 这个类似于Bellman-Ford中的松弛操作。 如果是边权代价的话把 \(a_i\) 换成 \(w(e_{i,j})\) 。 然而转移顺序比较麻烦,我们需要制定一个符合拓扑序的转移顺序。 一种可行的方案是先枚举集合

最小斯坦纳树

陌路散爱 提交于 2019-11-29 10:00:38
$dp[i][state]$ 表示以$i$为根,指定集合中的点的连通状态为state的生成树的最小总权值 有两种转移方向: 1、先通过连通状态的子集进行转移。 2、在当前枚举的连通状态下,对该连通状态进行松弛操作。 P4294 [WC2008]游览计划 注意景点的个数不超过10个。 $dp[i][j][state]$ 表示在$[i, j]$这个点与state中对应点连通的最小代价。 那么就可以用状压DP + spfa求解。 由于要输出方案,可以记录每个状态的前一个状态,最后dfs跑一遍就行了。 // #pragma GCC optimize(2) // #pragma GCC optimize(3) // #pragma GCC optimize(4) #include <algorithm> #include <iterator> #include <iostream> #include <cstring> #include <cstdlib> #include <iomanip> #include <bitset> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <stack> #include <cmath> #include <queue> #include

WC 2008 观光计划(斯坦纳树)

馋奶兔 提交于 2019-11-28 02:40:46
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=2595 思路 是一道比较裸的斯坦纳树呢~ 题意等价于选出包含一些点的最小生成树,这就是斯坦纳树的功能。 举个例子,给定 \(n\) 个点,其中 \(k\) 个点被称作关键点, \(m\) 条带权边,求原图的一个权值最小的子图,这张子图图为包含这 \(k\) 个点的树。 我们定义 \(dp[i][j]\) 为关键点集合 \(i\) 与任意节点 \(j\) 连通的最小权的树。考虑转移这个 \(dp\) 数组,比较显然的是以下的子集划分: \[ dp[i][j]=\min(dp[k][j]+dp[i\setminus k][j]) \] 其中 \(k\) 是 \(i\) 的子集。 当然这样转移是不够的,在关键点集合 \(i\) 不变的情况下, \(j\) 有可能会发生改变,即发生如下转移: \[ \text{chk_min}(dp[i][k],dp[i][j]+w(j,k)) \] 其中 \(w(j,k)\) 为一条 \(j\) 指向 \(k\) 的边的边权。不难发现,这个过程和最短路的松弛操作是一样的,那么就可以利用最短路进行转移,没有负边就跑 \(\text{dijkstra}\) ,否则跑 \(\text{spfa}\) 。 这道题求的东西略微不同,是点有点权,不过无所谓

8.10总结

杀马特。学长 韩版系。学妹 提交于 2019-11-26 22:26:59
8.10总结 得分 60+0+30 T2挂了10分,T3挂了30分 T3没看到要mod!!! T1 正解 类欧 T2 正解 斯坦纳树 对于每一层,赋好初值之后做一次斯坦纳树把那一层的宝藏连起来 然后把这一层的全部宝藏看作一个宝藏给下一层赋初值。 T3 正解 把每一行相连的块压成一个点。 对那些点连边,做树形dp。 列也同理。 小结 一定要注意有没有模数!!! 遇到难题不要慌,先把暴力分拿满 来源: https://www.cnblogs.com/leason-lyx/p/11333965.html