【学习笔记】有向图三元环计数

怎么没人讲这个的()

前置知识:无向图三元环计数。

对于给定的有向图,考虑先将其所有边改为双向边得到一张无向图,然后对这张图跑三元环计数。然后对于得到的每个三元环,将其全部 \(3\) 条边再在给出的有向图中判定边是否存在即可。

直接开 set 记录原有向图上每条边然后判定时间复杂度为 \(O(m^{\frac32}\log m)\),难以接受。这里给出两个优化方案:

  • 方案 \(1\):将 set 替换为哈希表,可以做到理论 \(O(m^{\frac32})\),不知道能不能卡过去(应该能)。
  • 方案 \(2\):类比无向图三元环计数,在每条边上加一个权值,表示该边在原来的有向图上只有正向 / 逆向 / 两个方向都有(有逆向是因为无向图三元环计数中为了保证时间复杂度连出的边可能是原来有向图边的反边)。这样在无向图三元环计数枚举 \(i\) 点的所有出边 \(j\),给 \(j\) 点打时间戳的时候,同时记录 \(j\) 点从 \(i\) 点连过来,以及 \(i\) 点连向 \(j\) 点的边的权值。这样就可以得到每个无向图三元环三条边以及其权值。
  • 此时假设三元环为 \((i,j,k)\),只需要枚举下面的两个有向图三元环是否真的合法:
    • \(i\to j,j\to k,k\to i\)
    • \(i\to k,k\to j,j\to i\)
  • 这个东西拿前面维护出的边权就可以 \(O(1)\) 判定。因此总时间复杂度为 \(O(m^{\frac 32})\),可以通过该题。
posted @ 2026-01-31 19:05  0103abc  阅读(3)  评论(0)    收藏  举报