- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种。最小生成树是在给定的点集和边中寻求最短网络使所有点连通。而最小斯坦纳树允许在给定点外增加额外的点,使生成的最短网络开销最小。-------- 百度百科 。
在图论里,一般用于解决形如:
给定一个连通图 \(G\) ,给定 \(k\) 个关键点,选取一些边使得 \(k\) 个关键点连通,要求权值和最小.
最小生成树可以看作是一种特殊的斯坦纳树.
我们不难想到,给出的 \(k\) 个点可能并不能只用连接这 \(k\) 个点的边达到连通,有可能需要另外 \(n-k\) 个点的中转;其次,可能经过外面 \(n-k\) 个点中的点的中转,可以让边权和更小.
我们发现 \(k\) 很小,所以可以使用状压来试试.
我们用 \(f[i][S]\) 表示以 \(i\) 为根的树,包含 \(S\) 内所有点的最小边权值和.
首先我们知道最后形成的是一棵树,不难想到最后有个环的话去掉最大的那条边也可以.
我们考虑如何转移状态:
其中 \(subs\) 是 \(s\) 状态的一个子集,这个是保证一开始 \(f[i][s]\) 尽量小.
/*
* @Author: Aisaka_Taiga
* @Date: 2023-10-02 17:28:45
* @LastEditTime: 2023-10-02 19:27:11
* @LastEditors: Aisaka_Taiga
* @FilePath: \Desktop\P6192.cpp
* The heart is higher than the sky, and life is thinner than paper.
*/
#include <bits/stdc++.h>
#define pii pair<int, int>
#define INF 0x3f3f3f3f
#define int long long
#define M 5010
#define N 510
using namespace std;
inline int read()
{
int x = 0, f = 1;
char c = getchar();
while(c < '0' || c > '9'){if(c == '-') f = -1; c = getchar();}
while(c <= '9' && c >= '0') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return x * f;
}
int n, m, k, cnt, head[M], f[N][M], vis[N], key[N];
struct node{int u, v, w, next;}e[N << 1];
priority_queue<pii, vector<pii>, greater<pii> > q;
inline void add(int u, int v, int w){e[++ cnt] = (node){u, v, w, head[u]}; head[u] = cnt;}
inline void Dij(int s)
{
memset(vis, 0, sizeof vis);//清空vis
while(!q.empty())
{
int u = q.top().second;//取出当前点
q.pop();
if(vis[u]) continue;//如果之前找过了就不用遍历了
vis[u] = 1;//打标记
for(int i = head[u]; i; i = e[i].next)
{
int v = e[i].v;//终点
if(f[v][s] <= f[u][s] + e[i].w) continue;//如果加入了这条边边权和更大了就不加
f[v][s] = f[u][s] + e[i].w;//松弛
q.push({f[v][s], v});//入堆
}
}
return ;
}
signed main()
{
memset(f, INF, sizeof f);
n = read(), m = read(), k = read();
for(int i = 1; i <= m; i ++)
{
int u = read(), v = read(), w = read();
add(u, v, w);
add(v, u, w);
}
for(int i = 1; i <= k; i ++)
{
key[i] = read();
f[key[i]][1 << (i - 1)] = 0;//以关建点为根,只包含当前点的代价是0
}
for(int s = 1; s <= (1 << k); s ++)//枚举k个点的所有状态
{
for(int i = 1; i <= n; i ++)//枚举每一个点
{
for(int subs = s & (s - 1); subs; subs = s & (subs - 1))//枚举每一个子集
f[i][s] = min(f[i][s], f[i][subs] + f[i][s ^ subs]);//DP取最小值
if(f[i][s] != INF) q.push({f[i][s], i});//只要不是全是INF就可以试试
}
Dij(s);//跑DIJ
}
cout << f[key[1]][(1 << k) - 1] << endl;//输出以1为根的子树所有关键点都在里面最小的边权和
return 0;
}
参考博客: https://www.luogu.com.cn/blog/ydz2010/si-tan-na-shu 。
最后此篇关于学习笔记——斯坦纳树的文章就讲到这里了,如果你想了解更多关于学习笔记——斯坦纳树的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
介绍篇 什么是MiniApis? MiniApis的特点和优势 MiniApis的应用场景 环境搭建 系统要求 安装MiniApis 配置开发环境 基础概念 MiniApis架构概述
我正在从“JavaScript 圣经”一书中学习 javascript,但我遇到了一些困难。我试图理解这段代码: function checkIt(evt) { evt = (evt) ? e
package com.fastone.www.javademo.stringintern; /** * * String.intern()是一个Native方法, * 它的作用是:如果字
您会推荐哪些资源来学习 AppleScript。我使用具有 Objective-C 背景的传统 C/C++。 我也在寻找有关如何更好地开发和从脚本编辑器获取更快文档的技巧。示例提示是“查找要编写脚本的
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改善这个问题吗?更新问题,以便堆栈溢出为 on-topic。 6年前关闭。 Improve this
我是塞内加尔的阿里。我今年60岁(也许这是我真正的问题-笑脸!!!)。 我正在学习Flutter和Dart。今天,我想使用给定数据模型的列表(它的名称是Mortalite,请参见下面的代码)。 我尝试
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
学习 Cappuccino 的最佳来源是什么?我从事“传统”网络开发,但我对这个新框架非常感兴趣。请注意,我对 Objective-C 毫无了解。 最佳答案 如上所述,该网站是一个好地方,但还有一些其
我正在学习如何使用 hashMap,有人可以检查我编写的这段代码并告诉我它是否正确吗?这个想法是有一个在公司工作的员工列表,我想从 hashMap 添加和删除员工。 public class Staf
我正在尝试将 jQuery 与 CoffeScript 一起使用。我按照博客中的说明操作,指示使用 $ -> 或 jQuery -> 而不是 .ready() 。我玩了一下代码,但我似乎无法理解我出错
还在学习,还有很多问题,所以这里有一些。我正在进行 javascript -> PHP 转换,并希望确保这些做法是正确的。是$dailyparams->$calories = $calories;一条
我目前正在学习 SQL,以便从我们的 Magento 数据库制作一个简单的 RFM 报告,我目前可以通过导出两个查询并将它们粘贴到 Excel 模板中来完成此操作,我想摆脱 Excel 模板。 我认为
我知道我很可能会因为这个问题而受到抨击,但没有人问,我求助于你。这是否是一个正确的 javascript > php 转换 - 在我开始不良做法之前,我想知道这是否是解决此问题的正确方法。 JavaS
除了 Ruby-Doc 之外,哪些来源最适合获取一些示例和教程,尤其是关于 Ruby 中的 Tk/Tile?我发现自己更正常了 http://www.tutorialspoint.com/ruby/r
我只在第一次收到警告。这正常吗? >>> cv=LassoCV(cv=10).fit(x,y) C:\Python27\lib\site-packages\scikit_learn-0.14.1-py
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我是一名优秀的程序员,十分优秀!