zoukankan      html  css  js  c++  java
  • 浅析斯坦纳树

    浅析斯坦纳树

    一、概述

    斯坦纳树用来解决一下类似于最小连通性但是又不是单纯的最小生成树的问题。

    二、一般情况

    例题:洛谷P6192 【模板】最小斯坦纳树

    题意:给定一个带权无向图和(k)个定点,要求一个权值和最小的子图使得给定的所有点都在这个子图上并让这个子图权值最小。(kleq10,nleq100,mleq500)

    由于(k)非常小,考虑状压(dp),设(f(i,j))表示包含(i)号节点,满足对于定点的联通性为(j)的子图的最小权值。

    考虑转移有以下两种方式:

    (1)、可以在同一个点(i)把包含(i)的两个连通块并起来,那么这样的转移即为:

    [f(i,j)=min(f(i,j),f(i,S)+f(i,complement_jS)[Ssubset j]) ]

    (2)、可以在(i)这个点加一条边从而让(i)和其他连通块相合并:

    [f(i,j)=min(f(i,j),f(v,j)+val(i,v)) ]

    注意到这个方程实际上是三角形不等式,可以用(spfa)(dij)转移,那么我们对于每一种状态先处理出第一种转移,再(dij)转移第二种即可。

    最终答案就是(min f(i,2^k-1))

    三、点带权的斯坦纳树问题

    例题:[WC2008]游览计划

    求最小点权的斯坦纳树。

    问题的本质和边带权是一样的,特殊之处就是在子集合并的时候会算重一遍(i)点的权值,那么减掉即可。

    第一种转移变为

    [f(i,j)=min(f(i,j),f(i,S)+f(i,complement_jS-a_i)[Ssubset j]) ]

    即可。

    四、只要求某些定点之间相互连通的斯坦纳树问题

    例题1:[BZOJ4774]修路

    题意:要求一个边带权的最小子图使得(i(1leq ileq d))号点和(n-i+1)号点联通,(dleq4)

    首先考虑状压(dp),唯一的不同就是我们可以允许某些点之间不连通,那么先做一遍普通的斯坦纳树,之后我们再做一次子集(dp)即可,设(g(i))表示联通性为(i)最小的满足要求的斯坦纳森林的权值,那么转移枚举(i)的子集,之后要求这个子集和它的补集都必须满足如果第(i)个点在集合中那么第(n-i+1)个点必须在集合中即可。

    例题2:[JLOI2015]管道连接

    题意:要求一个边带权的最小子图使得所有给定的颜色相同的点都在同一个连通块内。

    同例题1,只不过判定合法子集的方式有所改变而已。

  • 相关阅读:
    Linux 操作文件目录
    前端HTML所遇到的报错
    【剑指offer】最小的k个数
    【剑指offer】数组中出现次数超过一半的数字
    【剑指offer】栈的压入、弹出序列
    【剑指offer】二叉树的镜像
    【剑指offer】反转链表
    【剑指offer】数值的整数次方
    【剑指offer】重建二叉树
    【剑指offer】旋转数组的最小数字
  • 原文地址:https://www.cnblogs.com/szmssf/p/14501452.html
Copyright © 2011-2022 走看看