首页 > 其他分享 >最小斯坦纳树

最小斯坦纳树

时间:2023-05-24 17:56:57浏览次数:30  
标签:复杂度 最小 斯坦纳 枚举 Theta subseteq

前言

我不太喜欢写板子,但是这个东西的状压 DP 太有启发性了。

问题简述

一个无向图 \(G = (V, E)\) 关于点集 \(S\subseteq V\) 的斯坦纳树定义为 \(G\) 的一个子图 \(G' = (V', E')\) 满足:

  1. \(G'\) 联通
  2. \(S\subseteq V'\)

求最小斯坦纳树,即给定边权 \(f: E\mapsto \mathbb R^+(\mathbb Z^+)\),最小化斯坦纳树所有边的边权和。斯坦纳树不一定是树,但是最小斯坦纳树一定是树。

做法

首先一个朴素做法:\(f_T\) 表示关于 \(T\) 的最小斯坦纳树。初始的时候把所有边加进去,然后每次枚举一个公共点,尝试合并两个集合。时间复杂度 \(\Theta(n3^n)\)。实在是烂到家了,比不过枚举点集跑最小生成树的 \(\Theta(m\log m+2^nm\alpha(n))\)。

但是我会优化!注意到,我们不关心 \(S\) 以外的那些点都有谁被连通了,只是利用它们去连那些 \(S\) 里的点。所以设 \(f_{i, T}\) 表示 \(\{i\}\cup T\) 的最小斯坦纳树。那么转移有两种:不改变 \(i\),把 \(T\) 枚举子集进行合并,没有代价。\(i\) 变成 \(j\),\(T\) 不变,代价是最短路。时间复杂度是 \(\Theta(n3^{|S|} + \min((m\log m)2^{|S|}, n^22^{|S|} + n^3))\)。反正自己想出来非常困难。

标签:复杂度,最小,斯坦纳,枚举,Theta,subseteq
From: https://www.cnblogs.com/kyeecccccc/p/17429094.html

相关文章

  • m基于matlab的LDPC译码算法性能仿真,对比BP译码,最小和译码以及归一化偏移最小和译码
    1.算法仿真效果matlab2022a仿真结果如下:  2.算法涉及理论知识概要       LDPC码是麻省理工学院RobertGallager于1963年在博士论文中提出的一种具有稀疏校验矩阵的分组纠错码。几乎适用于所有的信道,因此成为编码界近年来的研究热点。它的性能逼近香农极限,且描述和......
  • 低代码开发平台魔笔 X 浙江广电集团:“10天”成为行业最小创新单位!
    客户背景概述浙江广播电视集团(以下简称浙江台)是一家以广播电视为主业,兼营相关产业的综合媒体集团,是国内最具影响力的省级媒体之一。因新业务拓展需要,浙江台也需随之上线一套全新的媒资平台系统进行运营支撑,而新业务上线时间节点已迫近,项目组(10人)需要在10天内即完成新媒资平台系统......
  • 找到数组中第几个最小的数据
    找到数组中第几个最小的数据将经典的快速排序算法做简单修改即可示例代码如下:voidtestFindSpecificMin(){intarr[]={2,4,3,9,6,5,7,0,2,1};//intarr[]={4,2,9};//intarr[]={0,1,2,3,4,5,6,7,8};intposition=2;findSpe......
  • 最小公倍数
    自然语言解决问题:最小公倍数,如果有一个自然数a能被自然数b整除,则称a为b的倍数,为a的约数,对于两个整数来说,指该两数共有倍数中最小的一个。计算最小公倍数时,通常会借助最大公约数来辅助计算。最小公倍数=两数的乘积/最大公约(因)数解题时要避免和最大公约(因)数问题混淆。对于......
  • LeetCode 746.使用最小花费爬楼梯
    1.题目:给你一个整数数组cost,其中cost[i]是从楼梯第i个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为0或下标为1的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例1:输入:cost=[10,15,20]输出:15解释:你......
  • 最小花费上楼梯
    https://leetcode.cn/problems/min-cost-climbing-stairs/classSolution{public:intminCostClimbingStairs(vector<int>&cost){intsize=cost.size();vector<int>dp(size+1);//表示的是到达第i层的最小花费dp[0]=dp[1]=0;......
  • LeetCode/子数组的最小值之和
    给定一个整数数组arr,找到min(b)的总和,其中b的范围为arr的每个(连续)子数组。1.单调栈假如要遍历所有区间,哪怕可以直接获得最小值,时间复杂度也是O(n2)这里我们不逐个找对应区间,而是计算每个值对区间的贡献,可以将时间复杂度降到O(n)其实也就找遍历时当前值的左边界和右边界,在......
  • P5540 [BalkanOI2011] timeismoney | 最小乘积生成树
    题意给一个无向图,边有两个权\(a\)和\(b\),定义一个生成树的权值是\(\left(\sum\limits_{e\inT}a_e\right)\left(\sum\limits_{e\inT}b_e\right)\),求最小权值生成树。权值相同请最小化\(a\)的和。\(1\len\le200,1\lem\le10000,0\lea_e,b_e\le255\)。题解纯粹记......
  • 最小生成树
    最小生成树题目描述如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz。输入格式第一行包含两个整数\(N,M\),表示该图共有\(N\)个结点和\(M\)条无向边。接下来\(M\)行每行包含三个整数\(X_i,Y_i,Z_i\),表示有一条长度为\(Z_i\)的无向边连接结点\(X_i,Y_i\)......
  • 打卡 c语言趣味编程 求最小公倍数
    问题描述:求任意两个正整数的最小公倍数(LCM)。思路:输入两个正整数,假设为num1和num2。定义一个变量lcm并初始化为较大的那个数(即lcm=max(num1,num2))。进入一个循环,循环条件为lcm不能同时被num1和num2整除。在每次循环中,将lcm增加1。循环结束后,lcm的值就是最小......