MST与贪心策略

MST与贪心策略

  • 定理
  • Prim算法
  • Kruskal算法
  • Dijkstra框架
  • 综合应用:
  • 约定

定理

  • 割中最轻边(唯一)必在某个(全部)MST中(利用此结论可完成对Prim与Kruskal的证明)
  • 圈中最重边(唯一)必不在某个(全部)MST中
    • 证明:若在MST中,则去掉e后,MST被划分为X-Y,再取圈中另一可链接X-Y的边,加入MST中,立得一个更小的MST
  • 若所有圈/割的最重/轻边唯一 ⇒ \Rightarrow MST唯一,反之不成立
    • 证明即添加/删除最轻/重边,之后在证明这样构成的图是一棵树即可(容易证得连通无环)
  • (*)向一棵MST中任意加一边e,必构成一圈且e是圈中最大权。

Prim算法

  • 算法描述:
    • 记已选中点集为T,未选中点集为S,迭代的加入T-S距离最小的边
  • 正确性证明:
    • 法一
    • 只需证明任何一轮的生成树都满足(*)性质即可
    • 假设 T k − 1 满 足 ( ∗ ) 性 质 , 下 证 T k 也 满 足 ( ∗ ) 性 质 T_{k-1}满足(*)性质,下证T_k也满足(*)性质 Tk1()Tk()
      • T k 中 加 入 一 边 e , 若 e 在 T k − 1 中 , 则 命 题 成 立 , 若 e 不 在 T k − 1 T_k中加入一边e,若e在T_{k-1}中,则命题成立,若e不在T_{k-1} TkeeTk1eTk1中:
      • 则假定e不是圈中最大边,分别沿圈顺逆时针找到第一个大于e的两边e1,e2
      • 可以证明若Prim算法在之前先选择了e1,则接下来一定会先于e2选择e
      • 这与现在的G结构矛盾
      • 命题得证
    • 综上,Prim算法正确
    • 法二
    • 只需证明任何一个新加入的边都满足割中最小边即可(最后补证是树即可)
    • 显然,命题得证。(hhhhhh忘了这茬,我傻了)
  • 复杂度分析:
    • O ( ( n + m ) l o g n ) \Omicron((n+m)logn) O(n+m)logn

Kruskal算法

  • 算法描述:
    • 边排序,按序加边,并查集查环,无环则加
  • 复杂度分析: O ( m l o g m ) \Omicron(mlogm) O(mlogm)

Dijkstra框架

  • 证明相关
    • 数学归纳法:
      • 对Dijkstra的n的阶段进行数学归纳法证明,其中,第k个阶段表示从s到k个顶点的最短路都已确定
      • base:s到其自身的最短路长为0,显然成立
      • 若对于 ≤ k 均 成 立 : \le k均成立: k那么对于新被选中的第k+1个点z,我们设已经被选中的k个顶点构成点集S,则被选中路径经由S中一点m,我们需要证明其最短路就是我们选中的s->m->z:
      • 若不是s->m->z,
        • 假设经由S内另一点m2,使得s->m2->z小于s->m->z,但算法选中的是经由S中一点到达z最短的路径,所以这样的m2不存在
        • 假设经由S外一点m2使得s->m2->z小于s->m->z,但s->m2必然经由S内一点出去,记出边为e,则因为算法选中的是最短的,所以s->e大于s->m->z,而e->m2->z又大于等于0,所以s->e->m2->z大于等于s->m->z,矛盾
      • 所以,我们选中的z点正确。
      • 综上,Dijkstra框架证毕
    • 副产品:若从s点出发的边都是负权,则Disktra仍然实用(前提是无负圈)
    • 算法复杂度: O ( ( m + n ) l o g n ) 3 \Omicron((m+n)logn)3 O((m+n)logn)3

综合应用:

  • 输油管道问题
  • 附带点权最小问题
  • 油箱加油问题: w ( v ) = m a x ( w ( u ) , w ( u , v ) ) w(v)=max(w(u),w(u,v)) w(v)=max(w(u),w(u,v))
  • DAG求最短路:转置后拓扑排序即可

约定

  • 考试不考非图贪心
  • 贪心按照题意来即可,不必证明其正确性。

你可能感兴趣的:(算法,复习,笔记,图贪心)