小结:生成树

算法:

最小生成树的算法有:Prim(O(nlgn)),Kruskal(O(nlg**n)),Prim在某些场合很好用,某些场合必须用。。。Kruskal的话最快。。

技巧及应用:

当看到要求连通一个图的最小代价,显然最小生成树,例如

  1. 【BZOJ】1601: [Usaco2008 Oct]灌水(kruskal)

还有次小生成树,就是在非最小生成树中找一条边来替代生成树中的一条边(保证连通的情况下),然后更新最小值(当然我是嘴巴选手,还没写过QAQ)

如果要求按建树,只知道两两之间的距离,那么肯定这棵树是两两之间距离的最小生成树。我们可以将他们先看成一个完全图,因为最小生成树的边一定大于不是生成树的边,因此那些大于生成树边的边是可能满足距离相等的,反之,如果构造的树比其中一个边大,那么显然这个图是错误的。例题:

  1. 【noip模拟题】藏宝图(prim)

生成树计数:

  1. 【BZOJ】1016: [JSOI2008]最小生成树计数(kruskal+特殊的技巧)(依次加入边然后边权相同的边计算方案数,然后累计)
  2. 【BZOJ】1005: [HNOI2008]明明的烦恼(prufer编码+特殊的技巧)(好神的题!以数列的方式与树结构一一对应,从而计数)

 

你可能感兴趣的:(生成)