三元环
-
问题描述,给定无向图,然后求出三元环个数
-
建图做法:先把无向图转化为 (DAG) ,把边去重,然后把度数从小的点连向度数大的点。
-
显然的是,每个三元环只能被找到一次。
-
时间复杂度证明:
可知边 ((x, y)) 被遍历的次数是 (out_y),所以总复杂度是 (m imes out_i)
然后假设所有点 (out_i< sqrt m),那么上界就是 (m imes sqrt m)。
假设有点度数存在 (out_i> sqrt m),因为是度数低的连向度数高的,所以至少有 (sqrt m) 点连向 (i),并且度数也是 (sqrt m),所以,其实度数最大只能是小于 (sqrt m),不能大于 (sqrt m)。
所以总的时间复杂度是 (O(m sqrt m)) 的。
- 找环
for (int i = 1; i <= n; i ++) {
for (auto v:G[i]) vis[v] = i;
for (auto v:G[i]) {
for (auto vv : G[v]) {
if (vis[vv] == i)x++;
}
}
}