支配树 / Dominator_Tree(待补)

参考博客0
参考博客1
半支配点
在这里插入图片描述
支配树的生成方法实在难懂,网上博客多少有点表述不清。暂时先只掌握支配树的性质,存下求树的模板,日后再补上求树过程。

HDU 4694
模板题,ksf代码初始化有点问题,AC代码:

#include <cstdio>
#include <algorithm>
#include <iostream>

typedef long long ll ;
using namespace std;
//DT.init(n) -> DT.add(u,v) -> DT.work(root);
//DT.idom[i] : i 的最近支配点(root 到 i 距离 i 最近的必经点)
//需要完整的支配树用 idom[i]作为 fa[i]建树即可
const int N = 50005, M = 100005; //N 点数,M 主函数中调用 add 的次数
struct Dominator_Tree{
   
    private: struct eg{
    int v, next; }e[M*2+N];
    int tot, cnt, h[N], iw[N], li[N], fa[N], fo[N], vo[N], sdom[N], pre[N], bkt[N];
    inline void link(int h[],int u,int v){
    e[++cnt] = {
   v,h[u]}, h[u] = cnt; }
    inline int eval(int p){
    findf(p); return vo[p]; }
    int findf(int p){
   
        if(fo[p] == p) return p;
        int r = findf(fo[p]);
        if(sdom[vo[fo[p]]] < sdom[vo[p]]) vo[p] = vo[fo[p]];
        return fo[p] = r;
    }
    void dfs(int p){
   
        sdom[p] = iw[p] = ++tot, li[tot] = p;
        for(int i = h[p]; i; i = e[i].next)
        if(!iw[e[i].v]) dfs(e[i].v), fa[e[i].v] = p;
    }
    public: int idom[N];
    inline void add(int u, int v) {
    link(h, u, v), link(pre, v, u);}
    inline void work(int root){
   
        dfs(root); int p, fp;
        for(int j = tot; j >= 2; j--, bkt[fp] = 0){
   
            for(int i = pre[p=li[j]]; i; i=e[i].next)
                if(iw[e[i].v]) sdom[p] = min(sdom[p], sdom[eval(e[i].v)]);
            link(bkt, li[sdom[p]], p);
            for(int i = bkt[fp=fo[p
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值