嘘~ 正在从服务器偷取页面 . . .

OI易错点-图论


OI易错点-图论

一、图论基础

【易错点】

  1. ❗️新建虚拟结点 \(\boldsymbol{0}\) ,会向至多 \(n\) 个结点连边,空间要开 \(\boldsymbol{2}\) ❗️
  2. 无向图+链式前向星, \(\boldsymbol{2}\) 倍空间
  3. 多组数据不要忘了清空 pos
  4. 邻接矩阵处理重边 down(g[u][v], w) (无向图别忘了 g[v][u]
  5. ❗️树的欧拉序长度为 \(3n\) ,因此线段树要开 \(12n\)❗️

【算法相关】

  1. 自环要写 if(u==v)continue; 处理!
  2. ❗️树上dp题获取子节点个数,不可以直接用 vec[u].size() ,因为可能有重边❗️
  3. 二叉树的树高并不是固定 \(\mathcal{O}(\log n)\) 的,链也满足二叉树的定义,概念不要混淆了。

二、最短路算法

【易错点】

  1. \(\text{Dijkstra}\) 不要忘记把起点入队

  2. \(\text{Floyd}\) 相关问题注意 \(\text{INF}\) 值的设置不能过大

    0x3f3f3f3f3f3f3f3ff[i][j]+g[i][k]+g[k][j]很可能会溢出

【算法相关】

  1. \(\text{SPFA}\) 已死,能不用就不用

【相关问题1】无向图最小环问题

【算法相关】

  1. 在Floyd算法枚举 \(k_i\) 的时候,已经得到了前 \(k-1\) 个点的最短路径

    \(k-1\) 个点不包括点 \(k\) ,并且他们的最短路径中也不包括 \(k\)

【相关问题2】分层图(最短路)

【易错点】

  1. ❗️无向图的 e[SIZE] 数组大小为❗️ \[ M\times (K+1) \times 4 \]

【算法相关】

  1. \(\text{Dijkstra}\) 的时间复杂度 \(O(nk\log mk)\)

  2. ❗️要注意 \(k>(s \to t)\) 的情况,也就是路径的结点数比 \(k\) 小时,需要加边❗️

    for(int i=1; i<=k; i++)
        addEdge((i-1)*n+t,i*n+t,0);

三、Tarjan算法 [连通性问题]

【算法相关】

  1. ❗️无向图割点割边不能在函数内计算数量会重复计算,即 hack: (1,2)(1,3)(1,4)❗️

    // 这里是一个正确的函数板子
    void Tarjan(int u,int f)
    {
        static int tim = 0; int C = 0;
        dfn[u] = low[u] = ++tim;
        for(int i=head[u]; i; i=e[i].next)
        {
            int v = e[i].v;
            if(!dfn[v])
            {
                ++C; Tarjan(v,u); down(low[u], low[v]);
                if(f && dfn[u] <= low[v]) cut[u] = 1;
            }else if(v != f) down(low[u], dfn[v]);
        }
        if(!f && C>1) cut[u] = 1;
    }
  2. 强连通分量,在不连通的图要写

    for(int i=1; i<=n; i++) if(!dfn[i]) tarjan(i);

四、树上差分

【算法相关】

  1. 点权差分:在 \(u\) 加上 \(x\) ,在 \(v\) 加上 \(x\) ,在 \(\mathrm{lca}(u,v)\) 减去 \(2x\)
  2. 边权差分:在 \(u\) 加上 \(x\) ,在 \(v\) 加上 \(x\) ,在 \(\mathrm{lca}(u,v)\) 减去 \(x\) ,在 \(\mathrm{fa}(\mathrm{lca}(u,v))\) 减去 \(x\)

五、线段树优化建图

【算法相关】

  1. 注意要记录结点 \(i\) 对应入树的叶子结点的编号,这两个是不一样的!

六、最小生成树

【算法相关】

  1. 要注意图是否连通,如果不连通可能需要加虚点,同时注意边数变化

七、差分约束

【算法相关】

  1. 差分约束建边,\(x-y\le w\) ,则 \(\boldsymbol{y \to x}\) ,因为 \(d_y+w\ge d_x\)

八、网络流

【算法相关】

  1. 网络流反向边流量为 \(\boldsymbol{0}\) addEdge(u,v,w);addEdge(v,u,0);
  2. 二分图最大匹配数=最小点覆盖数 (König定理)

九、二分图最大权匹配

【算法相关】

  1. 多组匹配要注意清空

    for(int i=1; i<=n; i++)
        px[i]=py[i]=lx[i]=ly[i]=pre[i]=0;
  2. 初始化边权为 \(\mathrm{-INF}\) ,且要保证左部点个数小于等于右部点个数

    如果是非完美匹配,就将虚边边权设为 \(0\) 即可


文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录