2019暑训 Day5 树与并查集

Day 5

  1. 并查集查询的两种优化办法:按秩合并(缺陷是无法控制谁会成为父节点)、路径压缩(缺陷是树的结构被破坏)
  2. 最小生成树的两种算法:Prim算法和Kruscal算法。Prim算法与dij十分类似,从一个点开始扩散,将当前树的所有邻点中权重最小的加入树中,不断循环即可。Kruscal算法先将所有边的权重进行排序,从小到大进行遍历。如果当前边有两个点在树中了,那么continue进入下一条边;如果仅有一个点在树中,那么将另外一个点加入树中;如果没有点在树中,全部加入即可。
    对于kruscal算法,需要考虑会不会形成回路。 只有在不形成回路的情况下,才能加入到最小生成树中。显然只有在两个点原本都在树中的情况下才可能会产生回路,从而我们只需要对这种情况进行判断即可。判断回路可以dfs搜索,也可以用并查集。
    Kru算法和Prim算法图文详解 里面用了三个函数处理这个问题,一个是搜索某边端点在树中的个数,一个根据个数来进行不同的操作,最后一个单独用来判断是否有环。
    最后,我们比较一下两个算法的效率和时间复杂度。 Kruscal只需要对所有边进行一次排序,而prim算法在加入新点的时候会不断进行排序,尽管可以用优先队列优化排序算法,但是其效率还是略低于kru算法的。当我们比较两种算法的原理时,会发现pri是通过点的扩散构造出该生成树,而kru是根据边的权重来构造出该生成树。所以我们说,prime算法更适用于稠密图,时间复杂度是O(n^2);而kru更加适用于稀疏图,时间复杂度是O(eloge)。

你可能感兴趣的:(ACM)